Skip to content

Commit 505cae0

Browse files
committed
catalog/lease: handle range feed recovery for dropped descriptors
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
1 parent f20a6e3 commit 505cae0

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
@@ -1795,7 +1795,7 @@ func (m *Manager) refreshSomeLeases(ctx context.Context, refreshAndPurgeAllDescr
17951795
if _, err := acquireNodeLease(ctx, m, id, AcquireBackground); err != nil {
17961796
log.Errorf(ctx, "refreshing descriptor: %d lease failed: %s", id, err)
17971797

1798-
if errors.Is(err, catalog.ErrDescriptorNotFound) {
1798+
if errors.Is(err, catalog.ErrDescriptorNotFound) || errors.Is(err, catalog.ErrDescriptorDropped) {
17991799
// Lease renewal failed due to removed descriptor; Remove this descriptor from cache.
18001800
if err := purgeOldVersions(
18011801
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
@@ -3771,9 +3771,17 @@ func TestLeaseDescriptorRangeFeedFailure(t *testing.T) {
37713771
p.Params.ExecutionPhase != scop.PostCommitPhase {
37723772
return nil
37733773
}
3774+
foundDescriptorDrop := false
3775+
// Ensure we have a descriptor drop that will be executed before
3776+
// we mess with the range feed.
3777+
for _, op := range p.Stages[stageIdx].EdgeOps {
3778+
if _, ok := op.(*scop.MarkDescriptorAsDropped); ok {
3779+
foundDescriptorDrop = true
3780+
}
3781+
}
37743782
// Once this stage completes, we can "resume" the range feed,
37753783
// so the update is detected.
3776-
if stageIdx == 0 {
3784+
if foundDescriptorDrop {
37773785
rangeFeedResetChan = srv.ApplicationLayer(1).LeaseManager().(*lease.Manager).TestingSetDisableRangeFeedCheckpointFn(true)
37783786
enableAfterStageKnob.Swap(false)
37793787
grp.Go(func() error {
@@ -3797,15 +3805,20 @@ func TestLeaseDescriptorRangeFeedFailure(t *testing.T) {
37973805
// detects a problem.
37983806
defer srv.ApplicationLayer(1).LeaseManager().(*lease.Manager).TestingSetDisableRangeFeedCheckpointFn(false)
37993807
firstConn.Exec(t, "CREATE TABLE t1(n int)")
3808+
firstConn.Exec(t, "CREATE TABLE t2(n int)")
38003809
require.NoError(t, srv.WaitForFullReplication())
38013810
tx := secondConn.Begin(t)
38023811
_, err := tx.Exec("SELECT * FROM t1;")
38033812
require.NoError(t, err)
3813+
_, err = tx.Exec("SELECT * FROM t2;")
3814+
require.NoError(t, err)
38043815
// This schema change will wait for the connection on
38053816
// node 1 to release the lease. Because the rangefeed is
38063817
// disabled it will never know about the new version.
38073818
enableAfterStageKnob.Store(true)
3808-
firstConn.Exec(t, "ALTER TABLE t1 ADD COLUMN j INT DEFAULT 64")
3819+
firstConn.Exec(t, "SET autocommit_before_ddl=false")
3820+
firstConn.Exec(t, "SET use_declarative_schema_changer='unsafe_always'")
3821+
firstConn.Exec(t, "ALTER TABLE t1 ADD COLUMN j INT DEFAULT 64; DROP TABLE t2;")
38093822
_, err = tx.Exec("INSERT INTO t1 VALUES (32)")
38103823
if err != nil {
38113824
t.Fatal(err)

0 commit comments

Comments
 (0)