Skip to content

Commit 4bbdd4d

Browse files
authored
Merge pull request #148715 from fqazi/blathers/backport-release-24.3-148699
release-24.3: catalog/lease: handle range feed recovery for dropped descriptors
2 parents 1e03f5f + fa3d1c4 commit 4bbdd4d

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)