Skip to content

Commit b4b2a95

Browse files
craig[bot]fqazi
andcommitted
Merge #148699
148699: catalog/lease: handle range feed recovery for dropped descriptors r=fqazi a=fqazi Previously, when range feed recovery was executed by the lease manager, the operation would handle missing descriptors by removing them. However, it also needs to gracefully handle dropped descriptors in the same way, since dropped descriptors cannot be leased. This patch updates the recovery process and adds a test to confirm that dropped descriptors are correctly released by the lease manager. Fixes: #148598 Fixes: #148273 Fixes: #146536 Release note: None Co-authored-by: Faizan Qazi <[email protected]>
2 parents 17e2c52 + 4f51c66 commit b4b2a95

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

pkg/sql/catalog/lease/lease.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2052,7 +2052,7 @@ func (m *Manager) refreshSomeLeases(ctx context.Context, refreshAndPurgeAllDescr
20522052
if _, err := acquireNodeLease(ctx, m, id, AcquireBackground); err != nil {
20532053
log.Errorf(ctx, "refreshing descriptor: %d lease failed: %s", id, err)
20542054

2055-
if errors.Is(err, catalog.ErrDescriptorNotFound) {
2055+
if errors.Is(err, catalog.ErrDescriptorNotFound) || errors.Is(err, catalog.ErrDescriptorDropped) {
20562056
// Lease renewal failed due to removed descriptor; Remove this descriptor from cache.
20572057
if err := purgeOldVersions(
20582058
ctx, m.storage.db.KV(), id, true /* dropped */, 0 /* minVersion */, m,

pkg/sql/catalog/lease/lease_test.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3213,9 +3213,17 @@ func TestLeaseDescriptorRangeFeedFailure(t *testing.T) {
32133213
p.Params.ExecutionPhase != scop.PostCommitPhase {
32143214
return nil
32153215
}
3216+
foundDescriptorDrop := false
3217+
// Ensure we have a descriptor drop that will be executed before
3218+
// we mess with the range feed.
3219+
for _, op := range p.Stages[stageIdx].EdgeOps {
3220+
if _, ok := op.(*scop.MarkDescriptorAsDropped); ok {
3221+
foundDescriptorDrop = true
3222+
}
3223+
}
32163224
// Once this stage completes, we can "resume" the range feed,
32173225
// so the update is detected.
3218-
if stageIdx == 0 {
3226+
if foundDescriptorDrop {
32193227
rangeFeedResetChan = srv.ApplicationLayer(1).LeaseManager().(*lease.Manager).TestingSetDisableRangeFeedCheckpointFn(true)
32203228
enableAfterStageKnob.Swap(false)
32213229
grp.Go(func() error {
@@ -3239,15 +3247,20 @@ func TestLeaseDescriptorRangeFeedFailure(t *testing.T) {
32393247
// detects a problem.
32403248
defer srv.ApplicationLayer(1).LeaseManager().(*lease.Manager).TestingSetDisableRangeFeedCheckpointFn(false)
32413249
firstConn.Exec(t, "CREATE TABLE t1(n int)")
3250+
firstConn.Exec(t, "CREATE TABLE t2(n int)")
32423251
require.NoError(t, srv.WaitForFullReplication())
32433252
tx := secondConn.Begin(t)
32443253
_, err := tx.Exec("SELECT * FROM t1;")
32453254
require.NoError(t, err)
3255+
_, err = tx.Exec("SELECT * FROM t2;")
3256+
require.NoError(t, err)
32463257
// This schema change will wait for the connection on
32473258
// node 1 to release the lease. Because the rangefeed is
32483259
// disabled it will never know about the new version.
32493260
enableAfterStageKnob.Store(true)
3250-
firstConn.Exec(t, "ALTER TABLE t1 ADD COLUMN j INT DEFAULT 64")
3261+
firstConn.Exec(t, "SET autocommit_before_ddl=false")
3262+
firstConn.Exec(t, "SET use_declarative_schema_changer='unsafe_always'")
3263+
firstConn.Exec(t, "ALTER TABLE t1 ADD COLUMN j INT DEFAULT 64; DROP TABLE t2;")
32513264
_, err = tx.Exec("INSERT INTO t1 VALUES (32)")
32523265
if err != nil {
32533266
t.Fatal(err)

0 commit comments

Comments
 (0)