clone

a self-hosted multitenant nostr relay with sites, file storage, git hosting, and inbox and outbox delivery

remove history cursors when a sweep completes or its filter disappears

Dami committed 7d30ccd
commit
7d30ccdf656cc6881f36e27661401c11b7ac51c0
parent
74b3905e76bff61925afb9b7bb169d8034e90f69
author
Dami <dami.etoile@gmail.com>
3 files changed, +53 -6
Minternal/daemon/git_services.go13++++++++---
Minternal/daemon/git_sync_cursor_test.go10++++++---
Minternal/storage/maintenance.go36++++++++++++++++++++++++++++++
M internal/daemon/git_services.go +10 -3
@@ -154,7 +154,9 @@ func (t *Tenant) gitSyncPeer(ctx context.Context, repo gitrelay.Repository, targ
154154 return err155155 }156156 var result error157+ cursors := make(map[string]struct{})157158 for _, filter := range gitEventFilters(repo) {159+ cursors[gitHistoryCursorKey(target, filter)] = struct{}{}158160 result = errors.Join(result, t.gitPullFilter(ctx, transport, target, filter))159161 }160162 events, err := t.gitConversationEvents(ctx, repo)
@@ -162,9 +164,12 @@ func (t *Tenant) gitSyncPeer(ctx context.Context, repo gitrelay.Repository, targ
162164 return errors.Join(result, err)163165 }164166 for _, filter := range gitReplyFilters(events) {167+ cursors[gitHistoryCursorKey(target, filter)] = struct{}{}165168 result = errors.Join(result, t.gitPullFilter(ctx, transport, target, filter))166169 }167- return result170+ // Reply filters are chunked by root ID, so their keys shift as roots171+ // arrive. Drop cursors for filters this pass no longer uses.172+ return errors.Join(result, t.store.PruneSettings(ctx, gitHistoryCursorPrefix(target), cursors))168173 }169174 170175 func (t *Tenant) gitPullFilter(ctx context.Context, transport *replication.NostrTransport, target string, filter event.Filter) error {
@@ -216,7 +221,7 @@ func (t *Tenant) gitPullLargeFilter(ctx context.Context, transport *replication.
216221 if olderErr == nil {217222 // Finished this sweep. The next pass starts another from the head,218223 // allowing older events newly acquired by the peer to be discovered.219- result = errors.Join(result, t.store.PutSetting(ctx, key, storage.EventCursor{}))224+ result = errors.Join(result, t.store.DeleteSetting(ctx, key))220225 } else if errors.Is(olderErr, replication.ErrPullIncomplete) && len(older) > 0 {221226 result = errors.Join(result, t.store.PutSetting(ctx, key, oldestGitHistoryCursor(older)))222227 }
@@ -279,10 +284,12 @@ func oldestGitHistoryCursor(items []event.Event) storage.EventCursor {
279284 return storage.EventCursor{CreatedAt: oldest.CreatedAt, ID: oldest.ID}280285 }281286 287+func gitHistoryCursorPrefix(target string) string { return "grasp02.history." + target + "." }288+282289 func gitHistoryCursorKey(target string, filter event.Filter) string {283290 raw, _ := json.Marshal(filter)284291 sum := sha256.Sum256(raw)285- return "grasp02.history." + target + "." + hex.EncodeToString(sum[:])292+ return gitHistoryCursorPrefix(target) + hex.EncodeToString(sum[:])286293 }287294 288295 func (t *Tenant) gitHistoryWindow(ctx context.Context, target string, filter event.Filter) (event.Filter, bool, error) {
M internal/daemon/git_sync_cursor_test.go +7 -3
M internal/storage/maintenance.go +36 -0