From 01243d430d5e2eab3117bdf5db17c644b0c8517a Mon Sep 17 00:00:00 2001 From: Indent Date: Wed, 11 Nov 2026 06:16:58 +0000 Subject: [PATCH 1/2] backfill: re-arm history sync portal creation after new history sync payloads --- pkg/connector/backfill.go | 12 ++++++++++++ pkg/connector/client.go | 2 ++ 2 files changed, 14 insertions(+) diff --git a/pkg/connector/backfill.go b/pkg/connector/backfill.go index e2c7d114..c9cc4037 100644 --- a/pkg/connector/backfill.go +++ b/pkg/connector/backfill.go @@ -96,6 +96,14 @@ func (wa *WhatsAppClient) historySyncLoop(ctx context.Context) { } if resetTimer { timerPending.Store(true) + wa.historySyncPortalGen.Add(1) + if meta := wa.UserLogin.Metadata.(*waid.UserLoginMetadata); !meta.HistorySyncPortalsNeedCreating { + meta.HistorySyncPortalsNeedCreating = true + err := wa.UserLogin.Save(ctx) + if err != nil { + wa.UserLogin.Log.Err(err).Msg("Failed to save user login history sync portals need creating flag") + } + } } if timerPending.Load() { dispatchTimer.Reset(wa.Main.Config.HistorySync.DispatchWait) @@ -417,6 +425,7 @@ func (wa *WhatsAppClient) createPortalsFromHistorySync(ctx context.Context) { } }() ctx = log.WithContext(ctx) + gen := wa.historySyncPortalGen.Load() limit := wa.Main.Config.HistorySync.MaxInitialConversations loginTS := wa.UserLogin.Metadata.(*waid.UserLoginMetadata).LoggedInAt conversations, err := wa.Main.DB.Conversation.GetRecent(ctx, wa.UserLogin.ID, limit, loginTS) @@ -517,6 +526,9 @@ func (wa *WhatsAppClient) createPortalsFromHistorySync(ctx context.Context) { log.Info().Int("conversation_count", len(conversations)).Msg("Finished creating portals from history sync") go func() { wg.Wait() + if wa.historySyncPortalGen.Load() != gen { + return + } wa.UserLogin.Metadata.(*waid.UserLoginMetadata).HistorySyncPortalsNeedCreating = false err = wa.UserLogin.Save(ctx) if err != nil { diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 678c8d22..62f9a461 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -128,6 +128,8 @@ type WhatsAppClient struct { lastPresence types.Presence blocklistLock sync.Mutex + historySyncPortalGen atomic.Uint64 + disableNewsletter bool appStateRecoveryLock sync.Mutex From 664956a43b8d32388d4287916b4c5b4e151f644d Mon Sep 17 00:00:00 2001 From: Indent Date: Wed, 11 Nov 2026 06:58:41 +0000 Subject: [PATCH 2/2] backfill: serialize history sync portal flag updates --- pkg/connector/backfill.go | 12 +++++++++--- pkg/connector/client.go | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/pkg/connector/backfill.go b/pkg/connector/backfill.go index c9cc4037..27b23a5b 100644 --- a/pkg/connector/backfill.go +++ b/pkg/connector/backfill.go @@ -96,7 +96,8 @@ func (wa *WhatsAppClient) historySyncLoop(ctx context.Context) { } if resetTimer { timerPending.Store(true) - wa.historySyncPortalGen.Add(1) + wa.historySyncPortalLock.Lock() + wa.historySyncPortalGen++ if meta := wa.UserLogin.Metadata.(*waid.UserLoginMetadata); !meta.HistorySyncPortalsNeedCreating { meta.HistorySyncPortalsNeedCreating = true err := wa.UserLogin.Save(ctx) @@ -104,6 +105,7 @@ func (wa *WhatsAppClient) historySyncLoop(ctx context.Context) { wa.UserLogin.Log.Err(err).Msg("Failed to save user login history sync portals need creating flag") } } + wa.historySyncPortalLock.Unlock() } if timerPending.Load() { dispatchTimer.Reset(wa.Main.Config.HistorySync.DispatchWait) @@ -425,7 +427,9 @@ func (wa *WhatsAppClient) createPortalsFromHistorySync(ctx context.Context) { } }() ctx = log.WithContext(ctx) - gen := wa.historySyncPortalGen.Load() + wa.historySyncPortalLock.Lock() + gen := wa.historySyncPortalGen + wa.historySyncPortalLock.Unlock() limit := wa.Main.Config.HistorySync.MaxInitialConversations loginTS := wa.UserLogin.Metadata.(*waid.UserLoginMetadata).LoggedInAt conversations, err := wa.Main.DB.Conversation.GetRecent(ctx, wa.UserLogin.ID, limit, loginTS) @@ -526,7 +530,9 @@ func (wa *WhatsAppClient) createPortalsFromHistorySync(ctx context.Context) { log.Info().Int("conversation_count", len(conversations)).Msg("Finished creating portals from history sync") go func() { wg.Wait() - if wa.historySyncPortalGen.Load() != gen { + wa.historySyncPortalLock.Lock() + defer wa.historySyncPortalLock.Unlock() + if wa.historySyncPortalGen != gen { return } wa.UserLogin.Metadata.(*waid.UserLoginMetadata).HistorySyncPortalsNeedCreating = false diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 62f9a461..cfb48708 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -128,7 +128,8 @@ type WhatsAppClient struct { lastPresence types.Presence blocklistLock sync.Mutex - historySyncPortalGen atomic.Uint64 + historySyncPortalLock sync.Mutex + historySyncPortalGen uint64 disableNewsletter bool