Skip to content

Commit fa3d1c4

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 b416650 commit fa3d1c4

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

1820-
if errors.Is(err, catalog.ErrDescriptorNotFound) {
1820+
if errors.Is(err, catalog.ErrDescriptorNotFound) || errors.Is(err, catalog.ErrDescriptorDropped) {
18211821
// Lease renewal failed due to removed descriptor; Remove this descriptor from cache.
18221822
if err := purgeOldVersions(
18231823
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
@@ -3765,9 +3765,17 @@ func TestLeaseDescriptorRangeFeedFailure(t *testing.T) {
37653765
p.Params.ExecutionPhase != scop.PostCommitPhase {
37663766
return nil
37673767
}
3768+
foundDescriptorDrop := false
3769+
// Ensure we have a descriptor drop that will be executed before
3770+
// we mess with the range feed.
3771+
for _, op := range p.Stages[stageIdx].EdgeOps {
3772+
if _, ok := op.(*scop.MarkDescriptorAsDropped); ok {
3773+
foundDescriptorDrop = true
3774+
}
3775+
}
37683776
// Once this stage completes, we can "resume" the range feed,
37693777
// so the update is detected.
3770-
if stageIdx == 0 {
3778+
if foundDescriptorDrop {
37713779
rangeFeedResetChan = srv.ApplicationLayer(1).LeaseManager().(*lease.Manager).TestingSetDisableRangeFeedCheckpointFn(true)
37723780
enableAfterStageKnob.Swap(false)
37733781
grp.Go(func() error {
@@ -3791,15 +3799,20 @@ func TestLeaseDescriptorRangeFeedFailure(t *testing.T) {
37913799
// detects a problem.
37923800
defer srv.ApplicationLayer(1).LeaseManager().(*lease.Manager).TestingSetDisableRangeFeedCheckpointFn(false)
37933801
firstConn.Exec(t, "CREATE TABLE t1(n int)")
3802+
firstConn.Exec(t, "CREATE TABLE t2(n int)")
37943803
require.NoError(t, srv.WaitForFullReplication())
37953804
tx := secondConn.Begin(t)
37963805
_, err := tx.Exec("SELECT * FROM t1;")
37973806
require.NoError(t, err)
3807+
_, err = tx.Exec("SELECT * FROM t2;")
3808+
require.NoError(t, err)
37983809
// This schema change will wait for the connection on
37993810
// node 1 to release the lease. Because the rangefeed is
38003811
// disabled it will never know about the new version.
38013812
enableAfterStageKnob.Store(true)
3802-
firstConn.Exec(t, "ALTER TABLE t1 ADD COLUMN j INT DEFAULT 64")
3813+
firstConn.Exec(t, "SET autocommit_before_ddl=false")
3814+
firstConn.Exec(t, "SET use_declarative_schema_changer='unsafe_always'")
3815+
firstConn.Exec(t, "ALTER TABLE t1 ADD COLUMN j INT DEFAULT 64; DROP TABLE t2;")
38033816
_, err = tx.Exec("INSERT INTO t1 VALUES (32)")
38043817
if err != nil {
38053818
t.Fatal(err)

0 commit comments

Comments
 (0)