From 92c27e28a25951e79103c8270531dfeee4988d5f Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Sat, 1 Aug 2020 04:03:59 +0530 Subject: [PATCH] Retry should not happen when in dedicated connection Signed-off-by: Harshit Gangal --- go/vt/vttablet/queryservice/wrapped.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/go/vt/vttablet/queryservice/wrapped.go b/go/vt/vttablet/queryservice/wrapped.go index 66a88188ac4..ae1487d4278 100644 --- a/go/vt/vttablet/queryservice/wrapped.go +++ b/go/vt/vttablet/queryservice/wrapped.go @@ -178,12 +178,12 @@ func (ws *wrappedService) ReadTransaction(ctx context.Context, target *querypb.T } func (ws *wrappedService) Execute(ctx context.Context, target *querypb.Target, query string, bindVars map[string]*querypb.BindVariable, transactionID, reservedID int64, options *querypb.ExecuteOptions) (qr *sqltypes.Result, err error) { - inTransaction := transactionID != 0 - err = ws.wrapper(ctx, target, ws.impl, "Execute", inTransaction, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { + inDedicatedConn := transactionID != 0 || reservedID != 0 + err = ws.wrapper(ctx, target, ws.impl, "Execute", inDedicatedConn, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { var innerErr error qr, innerErr = conn.Execute(ctx, target, query, bindVars, transactionID, reservedID, options) // You cannot retry if you're in a transaction. - retryable := canRetry(ctx, innerErr) && (!inTransaction) + retryable := canRetry(ctx, innerErr) && (!inDedicatedConn) return retryable, innerErr }) return qr, err @@ -208,17 +208,18 @@ func (ws *wrappedService) ExecuteBatch(ctx context.Context, target *querypb.Targ var innerErr error qrs, innerErr = conn.ExecuteBatch(ctx, target, queries, asTransaction, transactionID, options) // You cannot retry if you're in a transaction. - retryable := canRetry(ctx, innerErr) && (!inTransaction) + retryable := canRetry(ctx, innerErr) && !inTransaction return retryable, innerErr }) return qrs, err } func (ws *wrappedService) BeginExecute(ctx context.Context, target *querypb.Target, preQueries []string, query string, bindVars map[string]*querypb.BindVariable, reservedID int64, options *querypb.ExecuteOptions) (qr *sqltypes.Result, transactionID int64, alias *topodatapb.TabletAlias, err error) { - err = ws.wrapper(ctx, target, ws.impl, "BeginExecute", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { + inDedicatedConn := reservedID != 0 + err = ws.wrapper(ctx, target, ws.impl, "BeginExecute", inDedicatedConn, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { var innerErr error qr, transactionID, alias, innerErr = conn.BeginExecute(ctx, target, preQueries, query, bindVars, reservedID, options) - return canRetry(ctx, innerErr), innerErr + return canRetry(ctx, innerErr) && !inDedicatedConn, innerErr }) return qr, transactionID, alias, err } @@ -294,21 +295,22 @@ func (ws *wrappedService) ReserveBeginExecute(ctx context.Context, target *query } func (ws *wrappedService) ReserveExecute(ctx context.Context, target *querypb.Target, preQueries []string, sql string, bindVariables map[string]*querypb.BindVariable, transactionID int64, options *querypb.ExecuteOptions) (*sqltypes.Result, int64, *topodatapb.TabletAlias, error) { - inTransaction := transactionID != 0 + inDedicatedConn := transactionID != 0 var res *sqltypes.Result var reservedID int64 var alias *topodatapb.TabletAlias - err := ws.wrapper(ctx, target, ws.impl, "ReserveExecute", inTransaction, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { + err := ws.wrapper(ctx, target, ws.impl, "ReserveExecute", inDedicatedConn, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { var err error res, reservedID, alias, err = conn.ReserveExecute(ctx, target, preQueries, sql, bindVariables, transactionID, options) - return canRetry(ctx, err) && !inTransaction, err + return canRetry(ctx, err) && !inDedicatedConn, err }) return res, reservedID, alias, err } func (ws *wrappedService) Release(ctx context.Context, target *querypb.Target, transactionID, reservedID int64) error { - return ws.wrapper(ctx, target, ws.impl, "Release", false, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { + inDedicatedConn := transactionID != 0 || reservedID != 0 + return ws.wrapper(ctx, target, ws.impl, "Release", inDedicatedConn, func(ctx context.Context, target *querypb.Target, conn QueryService) (bool, error) { // No point retrying Release. return false, conn.Release(ctx, target, transactionID, reservedID) })