Skip to content

Commit c15eeab

Browse files
committed
Merge remote-tracking branch 'origin/release-15.0' into vtexplain-less-flags
Signed-off-by: Florent Poinsard <florent.poinsard@outlook.fr>
2 parents 53e3250 + 173b483 commit c15eeab

File tree

7 files changed

+165
-24
lines changed

7 files changed

+165
-24
lines changed

.github/workflows/cluster_endtoend_vttablet_prscomplex.yml

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ jobs:
5454
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true'
5555
uses: actions/setup-go@v2
5656
with:
57-
go-version: 1.18.5
57+
go-version: 1.18.7
5858

5959
- name: Set up python
6060
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true'
@@ -71,16 +71,17 @@ jobs:
7171
- name: Get dependencies
7272
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true'
7373
run: |
74-
# Setup Percona Server for MySQL 8.0
74+
75+
# Get key to latest MySQL repo
76+
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29
77+
# Setup MySQL 8.0
78+
wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.20-1_all.deb
79+
echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections
80+
sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config*
7581
sudo apt-get update
76-
sudo apt-get install -y lsb-release gnupg2 curl
77-
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
78-
sudo DEBIAN_FRONTEND="noninteractive" dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
79-
sudo percona-release setup ps80
80-
sudo apt-get update
81-
8282
# Install everything else we need, and configure
83-
sudo apt-get install -y percona-server-server percona-server-client make unzip g++ etcd git wget eatmydata xz-utils
83+
sudo apt-get install -y mysql-server mysql-client make unzip g++ etcd curl git wget eatmydata xz-utils
84+
8485
sudo service mysql stop
8586
sudo service etcd stop
8687
sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

go/cmd/vtadmin/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ func main() {
168168
rootCmd.Flags().BoolVar(&httpOpts.EnableTracing, "http-tracing", false, "whether to enable tracing on the HTTP server")
169169

170170
// gRPC server flags
171-
rootCmd.Flags().BoolVar(&opts.AllowReflection, "grpc-allow-reflection", false, "whether to register the gRPC server for reflection; this is required to use tools like `grpc_cli`")
171+
rootCmd.Flags().BoolVar(&opts.AllowReflection, "grpc-allow-reflection", false, "whether to register the gRPC server for reflection; this is required to use tools like grpc_cli")
172172
rootCmd.Flags().BoolVar(&opts.EnableChannelz, "grpc-enable-channelz", false, "whether to enable the channelz service on the gRPC server")
173173

174174
// HTTP server flags
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
Copyright 2022 The Vitess Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package misc
18+
19+
import (
20+
"context"
21+
_ "embed"
22+
"flag"
23+
"os"
24+
"testing"
25+
26+
"github.com/stretchr/testify/assert"
27+
"github.com/stretchr/testify/require"
28+
29+
"vitess.io/vitess/go/mysql"
30+
"vitess.io/vitess/go/test/endtoend/cluster"
31+
"vitess.io/vitess/go/test/endtoend/utils"
32+
)
33+
34+
var (
35+
clusterInstance *cluster.LocalProcessCluster
36+
vtParams mysql.ConnParams
37+
keyspaceName = "ks"
38+
cell = "test"
39+
40+
//go:embed schema.sql
41+
schemaSQL string
42+
)
43+
44+
func TestMain(m *testing.M) {
45+
defer cluster.PanicHandler(nil)
46+
flag.Parse()
47+
48+
exitCode := func() int {
49+
clusterInstance = cluster.NewCluster(cell, "localhost")
50+
defer clusterInstance.Teardown()
51+
52+
// Start topo server
53+
err := clusterInstance.StartTopo()
54+
if err != nil {
55+
return 1
56+
}
57+
58+
// Start keyspace
59+
keyspace := &cluster.Keyspace{
60+
Name: keyspaceName,
61+
SchemaSQL: schemaSQL,
62+
}
63+
err = clusterInstance.StartUnshardedKeyspace(*keyspace, 1, false)
64+
if err != nil {
65+
return 1
66+
}
67+
68+
// Start vtgate
69+
clusterInstance.VtGateExtraArgs = append(clusterInstance.VtGateExtraArgs,
70+
"--planner-version=gen4",
71+
"--mysql_default_workload=olap")
72+
err = clusterInstance.StartVtgate()
73+
if err != nil {
74+
return 1
75+
}
76+
77+
vtParams = mysql.ConnParams{
78+
Host: clusterInstance.Hostname,
79+
Port: clusterInstance.VtgateMySQLPort,
80+
}
81+
return m.Run()
82+
}()
83+
os.Exit(exitCode)
84+
}
85+
86+
/*
87+
TestStreamTxRestart tests that when a connection is killed my mysql (may be due to restart),
88+
then the transaction should not continue to serve the query via reconnect.
89+
*/
90+
func TestStreamTxRestart(t *testing.T) {
91+
ctx := context.Background()
92+
conn, err := mysql.Connect(ctx, &vtParams)
93+
require.NoError(t, err)
94+
defer conn.Close()
95+
96+
utils.Exec(t, conn, "begin")
97+
// BeginStreamExecute
98+
_ = utils.Exec(t, conn, "select connection_id()")
99+
100+
// StreamExecute
101+
_ = utils.Exec(t, conn, "select connection_id()")
102+
103+
// restart the mysql to terminate all the existing connections.
104+
primTablet := clusterInstance.Keyspaces[0].Shards[0].PrimaryTablet()
105+
err = primTablet.MysqlctlProcess.Stop()
106+
require.NoError(t, err)
107+
err = primTablet.MysqlctlProcess.StartProvideInit(false)
108+
require.NoError(t, err)
109+
110+
// query should return connection error
111+
_, err = utils.ExecAllowError(t, conn, "select connection_id()")
112+
require.Error(t, err)
113+
assert.Contains(t, err.Error(), "broken pipe (errno 2006) (sqlstate HY000)")
114+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
create table t1(
2+
id1 bigint,
3+
id2 bigint,
4+
primary key(id1)
5+
) Engine=InnoDB;

go/vt/vttablet/tabletserver/connpool/dbconn.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,24 @@ func (dbc *DBConn) streamOnce(ctx context.Context, query string, callback func(*
275275
return err
276276
}
277277

278+
// StreamOnce executes the query and streams the results. But, does not retry on connection errors.
279+
func (dbc *DBConn) StreamOnce(ctx context.Context, query string, callback func(*sqltypes.Result) error, alloc func() *sqltypes.Result, streamBufferSize int, includedFields querypb.ExecuteOptions_IncludedFields) error {
280+
resultSent := false
281+
return dbc.streamOnce(
282+
ctx,
283+
query,
284+
func(r *sqltypes.Result) error {
285+
if !resultSent {
286+
resultSent = true
287+
r = r.StripMetadata(includedFields)
288+
}
289+
return callback(r)
290+
},
291+
alloc,
292+
streamBufferSize,
293+
)
294+
}
295+
278296
var (
279297
getModeSQL = "select @@global.sql_mode"
280298
getAutocommit = "select @@autocommit"

go/vt/vttablet/tabletserver/query_executor.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ func (qre *QueryExecutor) Stream(callback StreamCallback) error {
303303
}
304304

305305
var replaceKeyspace string
306-
if sqltypes.IncludeFieldsOrDefault(qre.options) == querypb.ExecuteOptions_ALL {
306+
if sqltypes.IncludeFieldsOrDefault(qre.options) == querypb.ExecuteOptions_ALL && qre.tsv.sm.target.Keyspace != qre.tsv.config.DB.DBName {
307307
replaceKeyspace = qre.tsv.sm.target.Keyspace
308308
}
309309

@@ -1006,29 +1006,23 @@ func (qre *QueryExecutor) execStreamSQL(conn *connpool.DBConn, isTransaction boo
10061006
return callback(result)
10071007
}
10081008

1009-
qd := NewQueryDetail(qre.logStats.Ctx, conn)
1009+
start := time.Now()
1010+
defer qre.logStats.AddRewrittenSQL(sql, start)
10101011

10111012
// Add query detail object into QueryExecutor TableServer list w.r.t if it is a transactional or not. Previously we were adding it
10121013
// to olapql list regardless but that resulted in problems, where long-running stream queries which can be stateful (or transactional)
10131014
// weren't getting cleaned up during unserveCommon>handleShutdownGracePeriod in state_manager.go.
10141015
// This change will ensure that long-running streaming stateful queries get gracefully shutdown during ServingTypeChange
10151016
// once their grace period is over.
1017+
qd := NewQueryDetail(qre.logStats.Ctx, conn)
10161018
if isTransaction {
10171019
qre.tsv.statefulql.Add(qd)
10181020
defer qre.tsv.statefulql.Remove(qd)
1019-
} else {
1020-
qre.tsv.olapql.Add(qd)
1021-
defer qre.tsv.olapql.Remove(qd)
1022-
}
1023-
1024-
start := time.Now()
1025-
err := conn.Stream(ctx, sql, callBackClosingSpan, allocStreamResult, int(qre.tsv.qe.streamBufferSize.Get()), sqltypes.IncludeFieldsOrDefault(qre.options))
1026-
qre.logStats.AddRewrittenSQL(sql, start)
1027-
if err != nil {
1028-
// MySQL error that isn't due to a connection issue
1029-
return err
1021+
return conn.StreamOnce(ctx, sql, callBackClosingSpan, allocStreamResult, int(qre.tsv.qe.streamBufferSize.Get()), sqltypes.IncludeFieldsOrDefault(qre.options))
10301022
}
1031-
return nil
1023+
qre.tsv.olapql.Add(qd)
1024+
defer qre.tsv.olapql.Remove(qd)
1025+
return conn.Stream(ctx, sql, callBackClosingSpan, allocStreamResult, int(qre.tsv.qe.streamBufferSize.Get()), sqltypes.IncludeFieldsOrDefault(qre.options))
10321026
}
10331027

10341028
func (qre *QueryExecutor) recordUserQuery(queryType string, duration int64) {

test/config.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,15 @@
801801
"RetryMax": 1,
802802
"Tags": []
803803
},
804+
"vtgate_transaction_restart": {
805+
"File": "unused.go",
806+
"Args": ["vitess.io/vitess/go/test/endtoend/vtgate/transaction/restart"],
807+
"Command": [],
808+
"Manual": false,
809+
"Shard": "vtgate_transaction",
810+
"RetryMax": 1,
811+
"Tags": []
812+
},
804813
"vtgate_transaction_rollback": {
805814
"File": "unused.go",
806815
"Args": ["vitess.io/vitess/go/test/endtoend/vtgate/transaction/rollback"],

0 commit comments

Comments
 (0)