Skip to content

Commit c58cccf

Browse files
authored
Merge pull request #148714 from fqazi/blathers/backport-release-24.1-148699
release-24.1: catalog/lease: handle range feed recovery for dropped descriptors
2 parents 8ec5476 + 505cae0 commit c58cccf

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)