@@ -42,7 +42,6 @@ import (
42
42
"github.com/cockroachdb/cockroach/pkg/sql/physicalplan"
43
43
"github.com/cockroachdb/cockroach/pkg/sql/prep"
44
44
"github.com/cockroachdb/cockroach/pkg/sql/regions"
45
- "github.com/cockroachdb/cockroach/pkg/sql/sem/asof"
46
45
"github.com/cockroachdb/cockroach/pkg/sql/sem/eval"
47
46
"github.com/cockroachdb/cockroach/pkg/sql/sem/tree"
48
47
"github.com/cockroachdb/cockroach/pkg/sql/sessiondata"
@@ -1046,36 +1045,6 @@ func (ex *connExecutor) execStmtInOpenState(
1046
1045
stmtCtx = ctx
1047
1046
}
1048
1047
1049
- var rollbackHomeRegionSavepoint * tree.RollbackToSavepoint
1050
- var releaseHomeRegionSavepoint * tree.ReleaseSavepoint
1051
- enforceHomeRegion := p .EnforceHomeRegion ()
1052
- _ , isSelectStmt := stmt .AST .(* tree.Select )
1053
- if enforceHomeRegion && ex .state .mu .txn .IsOpen () && isSelectStmt {
1054
- // Create a savepoint at a point before which rows were read so that we can
1055
- // roll back to it, which will allow the txn to be modified with a
1056
- // historical timestamp (so that the locality-optimized ops used for error
1057
- // reporting can run locally and not incur latency). This is currently only
1058
- // supported for SELECT statements.
1059
- // Add some unprintable ASCII characters to the name of the savepoint to
1060
- // decrease the likelihood of collision with a user-created savepoint.
1061
- const enforceHomeRegionSavepointName = "enforce_home_region_sp\x11 \x12 \x13 "
1062
- s := & tree.Savepoint {Name : enforceHomeRegionSavepointName }
1063
- var event fsm.Event
1064
- var eventPayload fsm.EventPayload
1065
- if event , eventPayload , err = ex .execSavepointInOpenState (ctx , s , res ); err != nil {
1066
- return event , eventPayload , err
1067
- }
1068
-
1069
- releaseHomeRegionSavepoint = & tree.ReleaseSavepoint {Savepoint : enforceHomeRegionSavepointName }
1070
- rollbackHomeRegionSavepoint = & tree.RollbackToSavepoint {Savepoint : enforceHomeRegionSavepointName }
1071
- defer func () {
1072
- // The default case is to roll back the internally-generated savepoint
1073
- // after every request. We only need it if a retryable "query has no home
1074
- // region" error occurs.
1075
- ex .execRelease (ctx , releaseHomeRegionSavepoint , res )
1076
- }()
1077
- }
1078
-
1079
1048
if ex .state .mu .autoRetryReason != nil {
1080
1049
p .autoRetryCounter = int (ex .state .mu .autoRetryCounter )
1081
1050
ex .sessionTracing .TraceRetryInformation (
@@ -1127,54 +1096,6 @@ func (ex *connExecutor) execStmtInOpenState(
1127
1096
}
1128
1097
1129
1098
if err = res .Err (); err != nil {
1130
- setErrorAndRestoreLocality := func (err error ) {
1131
- res .SetError (err )
1132
- // We won't be faking the gateway region any more. Restore the original
1133
- // locality.
1134
- p .EvalContext ().Locality = p .EvalContext ().OriginalLocality
1135
- }
1136
- if execinfra .IsDynamicQueryHasNoHomeRegionError (err ) {
1137
- if rollbackHomeRegionSavepoint != nil {
1138
- // A retryable "query has no home region" error has occurred.
1139
- // Roll back to the internal savepoint in preparation for the next
1140
- // planning and execution of this query with a different gateway region
1141
- // (as considered by the optimizer).
1142
- p .StmtNoConstantsWithHomeRegionEnforced = p .stmt .StmtNoConstants
1143
- event , eventPayload := ex .execRollbackToSavepointInOpenState (
1144
- ctx , rollbackHomeRegionSavepoint , res ,
1145
- )
1146
- _ , isTxnRestart := event .(eventTxnRestart )
1147
- rollbackToSavepointFailed := ! isTxnRestart || eventPayload != nil
1148
- if ex .implicitTxn () && rollbackToSavepointFailed {
1149
- err = errors .AssertionFailedf (
1150
- "unable to roll back to internal savepoint for enforce_home_region" ,
1151
- )
1152
- setErrorAndRestoreLocality (err )
1153
- } else if rollbackToSavepointFailed || int (ex .state .mu .autoRetryCounter ) == len (ex .planner .EvalContext ().RemoteRegions ) {
1154
- // If rollback to savepoint in the transaction failed (perhaps because
1155
- // the txn was aborted) and we're in an explicit transaction, or we
1156
- // have retried the statement using each remote region as a fake
1157
- // gateway region, then give up and return the generic "query has no
1158
- // home region" error message.
1159
- err = execinfra .MaybeGetNonRetryableDynamicQueryHasNoHomeRegionError (err )
1160
- setErrorAndRestoreLocality (err )
1161
- }
1162
- } else {
1163
- err = execinfra .MaybeGetNonRetryableDynamicQueryHasNoHomeRegionError (err )
1164
- setErrorAndRestoreLocality (err )
1165
- }
1166
- } else if execinfra .IsDynamicQueryHasNoHomeRegionError (ex .state .mu .autoRetryReason ) {
1167
- // If we are retrying a dynamic "query has no home region" error and
1168
- // we get a different error message when executing with locality-optimized
1169
- // ops using a different local region (for example, relation does not
1170
- // exist, due to the AOST read), return the original error message in
1171
- // non-retryable form.
1172
- errorMessage := err .Error ()
1173
- if ! strings .HasPrefix (errorMessage , execinfra .QueryNotRunningInHomeRegionMessagePrefix ) {
1174
- err = execinfra .MaybeGetNonRetryableDynamicQueryHasNoHomeRegionError (ex .state .mu .autoRetryReason )
1175
- setErrorAndRestoreLocality (err )
1176
- }
1177
- }
1178
1099
return makeErrEvent (err )
1179
1100
}
1180
1101
@@ -2098,38 +2019,6 @@ func (ex *connExecutor) execStmtInOpenStateWithPausablePortal(
2098
2019
stmtCtx = ctx
2099
2020
}
2100
2021
2101
- var rollbackHomeRegionSavepoint * tree.RollbackToSavepoint
2102
- var releaseHomeRegionSavepoint * tree.ReleaseSavepoint
2103
- enforceHomeRegion := p .EnforceHomeRegion ()
2104
- _ , isSelectStmt := vars .stmt .AST .(* tree.Select )
2105
- // TODO(sql-sessions): ensure this is not broken for pausable portals.
2106
- // https://github.com/cockroachdb/cockroach/issues/99408
2107
- if enforceHomeRegion && ex .state .mu .txn .IsOpen () && isSelectStmt {
2108
- // Create a savepoint at a point before which rows were read so that we can
2109
- // roll back to it, which will allow the txn to be modified with a
2110
- // historical timestamp (so that the locality-optimized ops used for error
2111
- // reporting can run locally and not incur latency). This is currently only
2112
- // supported for SELECT statements.
2113
- // Add some unprintable ASCII characters to the name of the savepoint to
2114
- // decrease the likelihood of collision with a user-created savepoint.
2115
- const enforceHomeRegionSavepointName = "enforce_home_region_sp\x11 \x12 \x13 "
2116
- s := & tree.Savepoint {Name : enforceHomeRegionSavepointName }
2117
- var event fsm.Event
2118
- var eventPayload fsm.EventPayload
2119
- if event , eventPayload , err = ex .execSavepointInOpenState (ctx , s , res ); err != nil {
2120
- return event , eventPayload , err
2121
- }
2122
-
2123
- releaseHomeRegionSavepoint = & tree.ReleaseSavepoint {Savepoint : enforceHomeRegionSavepointName }
2124
- rollbackHomeRegionSavepoint = & tree.RollbackToSavepoint {Savepoint : enforceHomeRegionSavepointName }
2125
- defer func () {
2126
- // The default case is to roll back the internally-generated savepoint
2127
- // after every request. We only need it if a retryable "query has no home
2128
- // region" error occurs.
2129
- ex .execRelease (ctx , releaseHomeRegionSavepoint , res )
2130
- }()
2131
- }
2132
-
2133
2022
if ex .state .mu .autoRetryReason != nil {
2134
2023
p .autoRetryCounter = int (ex .state .mu .autoRetryCounter )
2135
2024
ex .sessionTracing .TraceRetryInformation (
@@ -2181,54 +2070,6 @@ func (ex *connExecutor) execStmtInOpenStateWithPausablePortal(
2181
2070
}
2182
2071
2183
2072
if err = res .Err (); err != nil {
2184
- setErrorAndRestoreLocality := func (err error ) {
2185
- res .SetError (err )
2186
- // We won't be faking the gateway region any more. Restore the original
2187
- // locality.
2188
- p .EvalContext ().Locality = p .EvalContext ().OriginalLocality
2189
- }
2190
- if execinfra .IsDynamicQueryHasNoHomeRegionError (err ) {
2191
- if rollbackHomeRegionSavepoint != nil {
2192
- // A retryable "query has no home region" error has occurred.
2193
- // Roll back to the internal savepoint in preparation for the next
2194
- // planning and execution of this query with a different gateway region
2195
- // (as considered by the optimizer).
2196
- p .StmtNoConstantsWithHomeRegionEnforced = p .stmt .StmtNoConstants
2197
- event , eventPayload := ex .execRollbackToSavepointInOpenState (
2198
- ctx , rollbackHomeRegionSavepoint , res ,
2199
- )
2200
- _ , isTxnRestart := event .(eventTxnRestart )
2201
- rollbackToSavepointFailed := ! isTxnRestart || eventPayload != nil
2202
- if ex .implicitTxn () && rollbackToSavepointFailed {
2203
- err = errors .AssertionFailedf (
2204
- "unable to roll back to internal savepoint for enforce_home_region" ,
2205
- )
2206
- setErrorAndRestoreLocality (err )
2207
- } else if rollbackToSavepointFailed || int (ex .state .mu .autoRetryCounter ) == len (ex .planner .EvalContext ().RemoteRegions ) {
2208
- // If rollback to savepoint in the transaction failed (perhaps because
2209
- // the txn was aborted) and we're in an explicit transaction, or we
2210
- // have retried the statement using each remote region as a fake
2211
- // gateway region, then give up and return the generic "query has no
2212
- // home region" error message.
2213
- err = execinfra .MaybeGetNonRetryableDynamicQueryHasNoHomeRegionError (err )
2214
- setErrorAndRestoreLocality (err )
2215
- }
2216
- } else {
2217
- err = execinfra .MaybeGetNonRetryableDynamicQueryHasNoHomeRegionError (err )
2218
- setErrorAndRestoreLocality (err )
2219
- }
2220
- } else if execinfra .IsDynamicQueryHasNoHomeRegionError (ex .state .mu .autoRetryReason ) {
2221
- // If we are retrying a dynamic "query has no home region" error and
2222
- // we get a different error message when executing with locality-optimized
2223
- // ops using a different local region (for example, relation does not
2224
- // exist, due to the AOST read), return the original error message in
2225
- // non-retryable form.
2226
- errorMessage := err .Error ()
2227
- if ! strings .HasPrefix (errorMessage , execinfra .QueryNotRunningInHomeRegionMessagePrefix ) {
2228
- err = execinfra .MaybeGetNonRetryableDynamicQueryHasNoHomeRegionError (ex .state .mu .autoRetryReason )
2229
- setErrorAndRestoreLocality (err )
2230
- }
2231
- }
2232
2073
return makeErrEvent (err )
2233
2074
}
2234
2075
@@ -2288,23 +2129,6 @@ func (ex *connExecutor) handleAOST(ctx context.Context, stmt tree.Statement) err
2288
2129
return errors .AssertionFailedf (
2289
2130
"cannot handle AOST clause without a transaction" ,
2290
2131
)
2291
- } else if execinfra .IsDynamicQueryHasNoHomeRegionError (ex .state .mu .autoRetryReason ) {
2292
- asOfClause := tree.AsOfClause {Expr : followerReadTimestampExpr }
2293
- // Set the timestamp used by current_timestamp().
2294
- asOf , err := p .EvalAsOfTimestamp (ctx , asOfClause , asof .OptionAllowBoundedStaleness )
2295
- if err != nil {
2296
- return errors .AssertionFailedf (
2297
- "problem evaluating follower read timestamp for enforce_home_region dynamic error checking" ,
2298
- )
2299
- }
2300
- // Set up AOST in the txn so re-running of the query with different possible
2301
- // home regions does not have to read rows from remote regions.
2302
- p .extendedEvalCtx .SetTxnTimestamp (asOf .Timestamp .GoTime ())
2303
- if err := ex .state .setHistoricalTimestamp (ctx , asOf .Timestamp ); err != nil {
2304
- // If the table was just created, we may not be able to set a historical
2305
- // timestamp.
2306
- return execinfra .MaybeGetNonRetryableDynamicQueryHasNoHomeRegionError (ex .state .mu .autoRetryReason )
2307
- }
2308
2132
}
2309
2133
asOf , err := p .isAsOf (ctx , stmt )
2310
2134
if err != nil {
@@ -3141,36 +2965,6 @@ func (ex *connExecutor) dispatchToExecutionEngine(
3141
2965
if limitsErr := ex .handleTxnRowsWrittenReadLimits (ctx ); limitsErr != nil && res .Err () == nil {
3142
2966
res .SetError (limitsErr )
3143
2967
}
3144
- if res .Err () == nil && err == nil {
3145
- autoRetryReason := ex .state .mu .autoRetryReason
3146
- if execinfra .IsDynamicQueryHasNoHomeRegionError (autoRetryReason ) {
3147
- if homeRegion , ok := planner .EvalContext ().Locality .Find ("region" ); ok &&
3148
- planner .StmtNoConstantsWithHomeRegionEnforced == planner .stmt .StmtNoConstants {
3149
- // If this is the same query as ran when the dynamic "query has no home
3150
- // region" error occurred, but this time it didn't error out, report
3151
- // back the query's home region.
3152
- err = pgerror .Newf (pgcode .QueryNotRunningInHomeRegion ,
3153
- `%s. Try running the query from region '%s'. %s` ,
3154
- execinfra .QueryNotRunningInHomeRegionMessagePrefix ,
3155
- homeRegion ,
3156
- sqlerrors .EnforceHomeRegionFurtherInfo ,
3157
- )
3158
- res .SetError (err )
3159
- // We won't be faking the gateway region any more. Restore the original
3160
- // locality.
3161
- planner .EvalContext ().Locality = planner .EvalContext ().OriginalLocality
3162
- return nil
3163
- }
3164
- // If for some reason we're not running the same query as before, report
3165
- // the original "query has no home region" error in non-retryable form.
3166
- err = execinfra .MaybeGetNonRetryableDynamicQueryHasNoHomeRegionError (autoRetryReason )
3167
- res .SetError (err )
3168
- // We won't be faking the gateway region any more. Restore the original
3169
- // locality.
3170
- planner .EvalContext ().Locality = planner .EvalContext ().OriginalLocality
3171
- return nil
3172
- }
3173
- }
3174
2968
3175
2969
return err
3176
2970
}
0 commit comments