You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
UpdateTimeToLive and DescribeTimeToLive during a table's DELETING window answer differently from DynamoDB #552
During a table's DELETING window the service serves UpdateTimeToLive and refuses DescribeTimeToLive with its own sentence; ExtendDB does the opposite.
Request during DELETING
Service (measured 2026-10-25)
ExtendDB (PostgreSQL and MongoDB measured; main744ea29 and #550)
UpdateTimeToLive enable
200 {Enabled: true, AttributeName: ttl}
400 ResourceInUseExceptionTable <name> is not in ACTIVE state
DescribeTimeToLive
400 ValidationExceptionCannot describe time to live while table is in DELETING state: Current table state is DELETING
200 {TimeToLiveStatus: DISABLED}
Cause
crates/engine/src/ttl.rs and the backends' TTL paths require ACTIVE for the update and do not check the status for the describe. #550 adds the TableBeingDeleted arm to the TTL error mapper, so a backend that returns the variant renders the DELETING sentence; none does yet.
Fix shape
Serve UpdateTimeToLive on a DELETING row (the write is to the catalog row, which goes with the table) and refuse DescribeTimeToLive with the measured sentence. Two dual-target wire rows on the held-window fixture.
Repeated the two rows on 2026-10-25, three rounds, each call issued while DescribeTable read DELETING (the status is checked right before every call and the row is skipped otherwise; none was skipped). Added the follow-on calls a fix has to answer.
Call during DELETING
Round 1 and 2 (TTL never enabled)
Round 3 (TTL ENABLED on ttl before the delete)
DescribeTimeToLive
400 ValidationExceptionCannot describe time to live while table is in DELETING state: Current table state is DELETING
400 ValidationExceptionTimeToLive is already enabled
DescribeTimeToLive after the enable
the DELETING sentence again
same
UpdateTimeToLive disable ttl right after
400 ValidationExceptionTime to live has been modified multiple times within a fixed interval
same
UpdateTimeToLive enable expires
400 ValidationExceptionTimeToLive is active on a different AttributeName: current AttributeName is ttl
same
So during the window UpdateTimeToLive runs its ordinary rules against the catalog row (the enable persists within the window: the disable is rate limited and the other attribute is refused as a conflict), and only DescribeTimeToLive has a DELETING sentence. The fix serves UpdateTimeToLive on a DELETING row with the same rules as on an ACTIVE one and refuses DescribeTimeToLive with the sentence above.
The window on the service was 3 to 5 s in these rounds; every row was measured inside it, and the table read ResourceNotFoundException afterwards.
Activity
LeeroyHannigan commentedon Oct 25, 2026
Repeated the two rows on 2026-10-25, three rounds, each call issued while
DescribeTablereadDELETING(the status is checked right before every call and the row is skipped otherwise; none was skipped). Added the follow-on calls a fix has to answer.DELETINGENABLEDonttlbefore the delete)DescribeTimeToLiveValidationExceptionCannot describe time to live while table is in DELETING state: Current table state is DELETINGUpdateTimeToLiveenablettl{TimeToLiveSpecification: {Enabled: true, AttributeName: ttl}}ValidationExceptionTimeToLive is already enabledDescribeTimeToLiveafter the enableDELETINGsentence againUpdateTimeToLivedisablettlright afterValidationExceptionTime to live has been modified multiple times within a fixed intervalUpdateTimeToLiveenableexpiresValidationExceptionTimeToLive is active on a different AttributeName: current AttributeName is ttlSo during the window
UpdateTimeToLiveruns its ordinary rules against the catalog row (the enable persists within the window: the disable is rate limited and the other attribute is refused as a conflict), and onlyDescribeTimeToLivehas aDELETINGsentence. The fix servesUpdateTimeToLiveon aDELETINGrow with the same rules as on anACTIVEone and refusesDescribeTimeToLivewith the sentence above.The window on the service was 3 to 5 s in these rounds; every row was measured inside it, and the table read
ResourceNotFoundExceptionafterwards.