Skip to content

Commit e1ef9d1

Browse files
authored
Merge pull request #148716 from fqazi/blathers/backport-release-25.1-148699
release-25.1: catalog/lease: handle range feed recovery for dropped descriptors
2 parents 9204771 + 4805a2a commit e1ef9d1

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

2177-
if errors.Is(err, catalog.ErrDescriptorNotFound) {
2177+
if errors.Is(err, catalog.ErrDescriptorNotFound) || errors.Is(err, catalog.ErrDescriptorDropped) {
21782178
// Lease renewal failed due to removed descriptor; Remove this descriptor from cache.
21792179
if err := purgeOldVersions(
21802180
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
@@ -3804,9 +3804,17 @@ func TestLeaseDescriptorRangeFeedFailure(t *testing.T) {
38043804
p.Params.ExecutionPhase != scop.PostCommitPhase {
38053805
return nil
38063806
}
3807+
foundDescriptorDrop := false
3808+
// Ensure we have a descriptor drop that will be executed before
3809+
// we mess with the range feed.
3810+
for _, op := range p.Stages[stageIdx].EdgeOps {
3811+
if _, ok := op.(*scop.MarkDescriptorAsDropped); ok {
3812+
foundDescriptorDrop = true
3813+
}
3814+
}
38073815
// Once this stage completes, we can "resume" the range feed,
38083816
// so the update is detected.
3809-
if stageIdx == 0 {
3817+
if foundDescriptorDrop {
38103818
rangeFeedResetChan = srv.ApplicationLayer(1).LeaseManager().(*lease.Manager).TestingSetDisableRangeFeedCheckpointFn(true)
38113819
enableAfterStageKnob.Swap(false)
38123820
grp.Go(func() error {
@@ -3830,15 +3838,20 @@ func TestLeaseDescriptorRangeFeedFailure(t *testing.T) {
38303838
// detects a problem.
38313839
defer srv.ApplicationLayer(1).LeaseManager().(*lease.Manager).TestingSetDisableRangeFeedCheckpointFn(false)
38323840
firstConn.Exec(t, "CREATE TABLE t1(n int)")
3841+
firstConn.Exec(t, "CREATE TABLE t2(n int)")
38333842
require.NoError(t, srv.WaitForFullReplication())
38343843
tx := secondConn.Begin(t)
38353844
_, err := tx.Exec("SELECT * FROM t1;")
38363845
require.NoError(t, err)
3846+
_, err = tx.Exec("SELECT * FROM t2;")
3847+
require.NoError(t, err)
38373848
// This schema change will wait for the connection on
38383849
// node 1 to release the lease. Because the rangefeed is
38393850
// disabled it will never know about the new version.
38403851
enableAfterStageKnob.Store(true)
3841-
firstConn.Exec(t, "ALTER TABLE t1 ADD COLUMN j INT DEFAULT 64")
3852+
firstConn.Exec(t, "SET autocommit_before_ddl=false")
3853+
firstConn.Exec(t, "SET use_declarative_schema_changer='unsafe_always'")
3854+
firstConn.Exec(t, "ALTER TABLE t1 ADD COLUMN j INT DEFAULT 64; DROP TABLE t2;")
38423855
_, err = tx.Exec("INSERT INTO t1 VALUES (32)")
38433856
if err != nil {
38443857
t.Fatal(err)

0 commit comments

Comments
 (0)