pingcap / pingcap/tidb

When the schema is out of date, transactions should fail quickly.

Open
#47,377 3 comments 0 reactions 0 assignees View on GitHub
found/gs type/enhancement
Dominant language
Go
Stars
40.5k
Forks
6.2k
PR merge metrics
PR metrics pending

Description

## Enhancement
If it is determined that the schema is out of date, there is no need to repeat the check schema version for each transaction.

```
\"[domain:8027]Information schema is out of date: schema failed to update in 1 lease, please make sure TiDB can connect to TiKV\
github.com/tikv/client-go/v2/txnkv/transaction.(*twoPhaseCommitter).checkSchemaValid\
\\t/go/pkg/mod/github.com/tikv/client-go/v2@v2.0.4-0.20230918062126-32c4ef54d6ed/txnkv/transaction/2pc.go:1922\
github.com/tikv/client-go/v2/txnkv/transaction.(*twoPhaseCommitter).execute\
\\t/go/pkg/mod/github.com/tikv/client-go/v2@v2.0.4-0.20230918062126-32c4ef54d6ed/txnkv/transaction/2pc.go:1586\
github.com/tikv/client-go/v2/txnkv/transaction.(*KVTxn).Commit\
\\t/go/pkg/mod/github.com/tikv/client-go/v2@v2.0.4-0.20230918062126-32c4ef54d6ed/txnkv/transaction/txn.go:502\
github.com/pingcap/tidb/store/driver/txn.(*tikvTxn).Commit\
\\t/tidb/store/driver/txn/txn_driver.go:87\
github.com/pingcap/tidb/session.(*LazyTxn).Commit\
\\t/tidb/session/txn.go:408\
github.com/pingcap/tidb/session.(*session).commitTxnWithTemporaryData\
\\t/tidb/session/session.go:856\
github.com/pingcap/tidb/session.(*session).doCommit\
\\t/tidb/session/session.go:742\
github.com/pingcap/tidb/session.(*session).doCommitWithRetry\
\\t/tidb/session/session.go:988\
github.com/pingcap/tidb/session.(*session).CommitTxn\
\\t/tidb/session/session.go:1118\
...
```

It will always take 5s get `ErrInfoSchemaExpired` error.

```golang
// CheckBySchemaVer checks if the schema version valid or not at txnTS.
func (s *SchemaChecker) CheckBySchemaVer(txnTS uint64, startSchemaVer tikv.SchemaVer) (*transaction.RelatedSchemaChange, error) {
schemaOutOfDateRetryInterval := SchemaOutOfDateRetryInterval.Load()
schemaOutOfDateRetryTimes := int(SchemaOutOfDateRetryTimes.Load())
for i := 0; i < schemaOutOfDateRetryTimes; i++ {
relatedChange, CheckResult := s.SchemaValidator.Check(txnTS, startSchemaVer.SchemaMetaVersion(), s.relatedTableIDs, s.needCheckSchema)
switch CheckResult {
case ResultSucc:
return nil, nil
case ResultFail:
metrics.SchemaLeaseErrorCounter.WithLabelValues("changed").Inc()
return relatedChange, ErrInfoSchemaChanged
case ResultUnknown:
time.Sleep(schemaOutOfDateRetryInterval)
}
}
metrics.SchemaLeaseErrorCounter.WithLabelValues("outdated").Inc()
return nil, ErrInfoSchemaExpired
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.