@@ -41,7 +41,7 @@ type LeaseManager interface {
4141
4242 GetLeaseGeneration () int64
4343
44- GetReadTimestamp (timestamp hlc.Timestamp ) lease.ReadTimestamp
44+ GetReadTimestamp (ctx context. Context , timestamp hlc.Timestamp ) lease.ReadTimestamp
4545}
4646
4747type deadlineHolder interface {
@@ -180,24 +180,27 @@ func (ld *leasedDescriptors) maybeAssertExternalRowDataTS(desc catalog.Descripto
180180}
181181
182182// maybeInitReadTimestamp selects a read timestamp for the lease manager.
183- func (ld * leasedDescriptors ) maybeInitReadTimestamp (txn deadlineHolder ) {
183+ func (ld * leasedDescriptors ) maybeInitReadTimestamp (ctx context. Context , txn deadlineHolder ) {
184184 // Refresh the leased timestamp if the read timestamp has changed on us
185185 // or if it hasn't been populated yet.
186- // TODO (fqazi): For locked read timestamps inside leasing,
187- // we will need to have extra logic to ensure this is safe.
188186 if ld .leaseTimestampSet &&
189187 ld .leaseTimestamp .GetBaseTimestamp () == txn .ReadTimestamp () {
190188 return
189+ } else if ld .leaseTimestampSet {
190+ // Timestamp is already set so release it before picking a new one.
191+ // TODO (fqazi): Add handling for moving timestamps forward.
192+ ld .leaseTimestamp .Release (ctx )
193+ ld .leaseTimestampSet = false
191194 }
192195 readTimestamp := txn .ReadTimestamp ()
193196 ld .leaseTimestampSet = true
194- // Fixed timestamp queries will use descriptors at the user select timestamp.
197+ // Fixed timestamp queries will use descriptors at the user-selected timestamp.
195198 if txn .ReadTimestampFixed () {
196199 ld .leaseTimestamp = lease .TimestampToReadTimestamp (readTimestamp )
197200 return
198201 }
199202 // Otherwise, get a safe read timestamp from the lease manager.
200- ld .leaseTimestamp = ld .lm .GetReadTimestamp (readTimestamp )
203+ ld .leaseTimestamp = ld .lm .GetReadTimestamp (ctx , readTimestamp )
201204}
202205
203206// getLeasedDescriptorByName return a leased descriptor valid for the
@@ -223,7 +226,7 @@ func (ld *leasedDescriptors) getByName(
223226 desc = cached .(lease.LeasedDescriptor ).Underlying ()
224227 return desc , false , nil
225228 }
226- ld .maybeInitReadTimestamp (txn )
229+ ld .maybeInitReadTimestamp (ctx , txn )
227230 ldesc , err := ld .lm .AcquireByName (ctx , ld .leaseTimestamp , parentID , parentSchemaID , name )
228231 const setTxnDeadline = true
229232 return ld .getResult (ctx , txn , setTxnDeadline , ldesc , err )
@@ -238,7 +241,7 @@ func (ld *leasedDescriptors) getByID(
238241 if cached := ld .getCachedByID (ctx , id ); cached != nil {
239242 return cached , false , nil
240243 }
241- ld .maybeInitReadTimestamp (txn )
244+ ld .maybeInitReadTimestamp (ctx , txn )
242245 desc , err := ld .lm .Acquire (ctx , ld .leaseTimestamp , id )
243246 const setTxnDeadline = false
244247 return ld .getResult (ctx , txn , setTxnDeadline , desc , err )
@@ -286,7 +289,7 @@ func (ld *leasedDescriptors) getResult(
286289 expiration := ldesc .Expiration (ctx )
287290 readTimestamp := txn .ReadTimestamp ()
288291 if expiration .LessEq (txn .ReadTimestamp ()) {
289- return nil , false , errors .AssertionFailedf ("bad descriptor for id=%d readTimestamp=%s, expiration=%s" , ldesc .GetID (), readTimestamp , expiration )
292+ return nil , false , errors .AssertionFailedf ("bad descriptor for id=%d readTimestamp=%s, expiration=%s (leaseTimestamp: %s) " , ldesc .GetID (), readTimestamp , expiration , ld . leaseTimestamp . GetTimestamp () )
290293 }
291294
292295 ld .cache .Upsert (ldesc , ldesc .Underlying ().SkipNamespace ())
@@ -391,6 +394,9 @@ func (ld *leasedDescriptors) releaseAll(ctx context.Context) {
391394 return nil
392395 })
393396 ld .cache .Clear ()
397+ if ld .leaseTimestampSet {
398+ ld .leaseTimestamp .Release (ctx )
399+ }
394400 ld .leaseTimestampSet = false
395401}
396402
@@ -401,6 +407,9 @@ func (ld *leasedDescriptors) release(ctx context.Context, descs []lease.IDVersio
401407 }
402408 }
403409 if ld .cache .Len () == 0 {
410+ if ld .leaseTimestampSet {
411+ ld .leaseTimestamp .Release (ctx )
412+ }
404413 ld .leaseTimestampSet = false
405414 }
406415}
0 commit comments