Skip to content

Commit 425e040

Browse files
perf(durable-iterator): improve resume events cleanup logic (#1102)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * Performance * Cleanup of expired events is now throttled to reduce overhead and improve responsiveness under load. * An initial cleanup still runs at startup when retention is enabled. * Behavior * Expired events may remain briefly accessible before being removed due to deferred cleanup. * Documentation * Retention settings updated to note that cleanup is deferred and some expired events can be temporarily available. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
1 parent 5e2cabd commit 425e040

1 file changed

Lines changed: 12 additions & 0 deletions

File tree

packages/durable-iterator/src/durable-object/resume-storage.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ export interface EventResumeStorageOptions extends StandardRPCJsonSerializerOpti
1313
*
1414
* @remarks
1515
* - Use infinite values to disable
16+
* - Note that for performance, expired event cleanup is deferred. This means
17+
* expired events may remain in storage for a short period beyond their
18+
* retention time.
1619
*
1720
* @default NaN (disabled)
1821
*/
@@ -197,7 +200,16 @@ export class EventResumeStorage<T extends object> {
197200
this.initSchema()
198201
}
199202

203+
private lastCleanupTime: number | undefined
200204
private cleanupExpiredEvents(): void {
205+
const now = Date.now()
206+
// defer cleanup to improve performance
207+
if (this.lastCleanupTime && this.lastCleanupTime + this.retentionSeconds * 1000 > now) {
208+
return
209+
}
210+
211+
this.lastCleanupTime = now
212+
201213
this.durableState.storage.sql.exec(`
202214
DELETE FROM "${this.schemaPrefix}events" WHERE stored_at < unixepoch() - ?
203215
`, this.retentionSeconds)

0 commit comments

Comments
 (0)