fix: corrected three sync read-status bugs#1141
Merged
Merged
Conversation
- RssLocalSync: items applied via alreadyReadGuids path now receive a read_status_synced entry immediately after upsert. Previously the entry was never written, so getFeedItemsWithoutSyncedReadMark() would return these items on the next sync and echo them back to the server as a new read mark. - SyncRestClient.getRead: latestMessageTimestamp is now advanced for corrupt (un-decryptable) marks before continuing. Previously the timestamp was only updated on success, so a single corrupt mark would cause the same mark to be retried on every subsequent sync. - RemoteReadMarkDao / Repository.applyRemoteReadMarks: added deleteRemoteReadMarksForReadItems() which removes remote_read_mark rows for items that already have read_time set. Called at the end of applyRemoteReadMarks() so stale marks can no longer override a deliberate mark-as-unread on the next sync cycle. Added tests: - RssLocalSyncKtTest: remoteReadMarkIsAppliedToNewItemAndMarkedAsSynced, applyRemoteReadMarksCleansStaleEntriesForAlreadyReadItems, itemsNotInRemoteReadMarkAreNotMarkedAsRead - SyncRestClientTest (new): getReadCallsRemoteMarkAsReadForEachReceivedMark, getReadAdvancesTimestampPastCorruptMark, markAsReadSendsItemsAndMarksThemAsSynced - RepositoryTest: updated applyRemoteReadMarks + added applyRemoteReadMarksCleansUpStaleMarksEvenWhenNothingToApply
jenningsloy318
pushed a commit
to jenningsloy318/Feeder
that referenced
this pull request
May 29, 2026
- RssLocalSync: items applied via alreadyReadGuids path now receive a read_status_synced entry immediately after upsert. Previously the entry was never written, so getFeedItemsWithoutSyncedReadMark() would return these items on the next sync and echo them back to the server as a new read mark. - SyncRestClient.getRead: latestMessageTimestamp is now advanced for corrupt (un-decryptable) marks before continuing. Previously the timestamp was only updated on success, so a single corrupt mark would cause the same mark to be retried on every subsequent sync. - RemoteReadMarkDao / Repository.applyRemoteReadMarks: added deleteRemoteReadMarksForReadItems() which removes remote_read_mark rows for items that already have read_time set. Called at the end of applyRemoteReadMarks() so stale marks can no longer override a deliberate mark-as-unread on the next sync cycle. Added tests: - RssLocalSyncKtTest: remoteReadMarkIsAppliedToNewItemAndMarkedAsSynced, applyRemoteReadMarksCleansStaleEntriesForAlreadyReadItems, itemsNotInRemoteReadMarkAreNotMarkedAsRead - SyncRestClientTest (new): getReadCallsRemoteMarkAsReadForEachReceivedMark, getReadAdvancesTimestampPastCorruptMark, markAsReadSendsItemsAndMarksThemAsSynced - RepositoryTest: updated applyRemoteReadMarks + added applyRemoteReadMarksCleansUpStaleMarksEvenWhenNothingToApply
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
RssLocalSync: items applied via alreadyReadGuids path now receive a read_status_synced entry immediately after upsert. Previously the entry was never written, so getFeedItemsWithoutSyncedReadMark() would return these items on the next sync and echo them back to the server as a new read mark.
SyncRestClient.getRead: latestMessageTimestamp is now advanced for corrupt (un-decryptable) marks before continuing. Previously the timestamp was only updated on success, so a single corrupt mark would cause the same mark to be retried on every subsequent sync.
RemoteReadMarkDao / Repository.applyRemoteReadMarks: added deleteRemoteReadMarksForReadItems() which removes remote_read_mark rows for items that already have read_time set. Called at the end of applyRemoteReadMarks() so stale marks can no longer override a deliberate mark-as-unread on the next sync cycle.
Added tests: