Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

table/tables: fix some stability issues with cached table #33171

Merged
merged 12 commits into from
Mar 17, 2022
1 change: 1 addition & 0 deletions table/tables/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ func (c *cachedTable) updateLockForRead(ctx context.Context, store kv.Storage, t
if succ {
mb, startTS, totalSize, err := c.loadDataFromOriginalTable(store, lease)
if err != nil {
log.Info("load data from table", zap.Error(err))
return
}

Expand Down
11 changes: 9 additions & 2 deletions table/tables/state_remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,15 +211,20 @@ func waitForLeaseExpire(oldReadLease, now uint64) time.Duration {
if oldReadLease >= now {
t1 := oracle.GetTimeFromTS(oldReadLease)
t2 := oracle.GetTimeFromTS(now)
waitDuration := t1.Sub(t2)
return waitDuration
if t1.After(t2) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change is to make the code more robust, handle waitDuration < 0

waitDuration := t1.Sub(t2)
return waitDuration
}
return time.Microsecond
}
return 0
}

// RenewReadLease renew the read lock lease.
// Return the current lease value on success, and return 0 on fail.
func (h *stateRemoteHandle) RenewReadLease(ctx context.Context, tid int64, oldLocalLease, newValue uint64) (uint64, error) {
h.Lock()
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The most important change to fix the panic issue.

defer h.Unlock()
var newLease uint64
err := h.runInTxn(ctx, func(ctx context.Context, now uint64) error {
lockType, remoteLease, _, err := h.loadRow(ctx, tid)
Expand Down Expand Up @@ -266,6 +271,8 @@ func (h *stateRemoteHandle) RenewReadLease(ctx context.Context, tid int64, oldLo
}

func (h *stateRemoteHandle) RenewWriteLease(ctx context.Context, tid int64, newLease uint64) (bool, error) {
h.Lock()
defer h.Unlock()
var succ bool
err := h.runInTxn(ctx, func(ctx context.Context, now uint64) error {
lockType, oldLease, _, err := h.loadRow(ctx, tid)
Expand Down