Bug 2039791 - Filter orphaned and non-folder-parent structure rows from fetch_remote_tree#7375
Open
mhammond wants to merge 2 commits into
Open
Bug 2039791 - Filter orphaned and non-folder-parent structure rows from fetch_remote_tree#7375mhammond wants to merge 2 commits into
mhammond wants to merge 2 commits into
Conversation
…from orphaned synced structure rows Towards bug 2039791.
…om fetch_remote_tree moz_bookmarks_synced_structure rows can accumulate with tombstoned/absent or non-folder parent endpoints. The strict dogear by_children call in pass 3 of fetch_remote_tree would fail on these with MissingParentForUnknownChild or InvalidParent respectively. Workaround: join against moz_bookmarks_synced to both report and skip rows whose endpoints are tombstoned/absent or whose parent is not a folder. * report via `report_error!` so we can learn more about what's wrong. * skip so dogear doesn't see the errors, with the expectation being that either the skip causes no problems (eg, tombstoned items) or are reparented (eg, when parent is missing entirely)
739f714 to
66ff63b
Compare
skhamis
approved these changes
May 20, 2026
Contributor
skhamis
left a comment
There was a problem hiding this comment.
This looks great! Excited to see if we can nab some of these persistent bookmark issues! Had one comment about exists vs max but don't feel strongly if we don't want to go that route.
| let root_guid_str = BookmarkRootGuid::Root.as_guid(); | ||
| let (child_tombstoned, child_absent, parent_tombstoned, parent_absent, non_folder_parent): | ||
| (bool, bool, bool, bool, bool) = self.db.query_row( | ||
| &format!( |
Contributor
There was a problem hiding this comment.
Instead of the exists here we could potentially use MAX that way we don't need the 5 exists. This would reduce the amount of scans this query would be doing.
SELECT
MAX(child.isDeleted IS 1),
MAX(child.guid IS NULL),
MAX(parent.isDeleted IS 1),
MAX(parent.guid IS NULL),
MAX(parent.isDeleted IS 0 AND parent.kind <> ?)
FROM moz_bookmarks_synced_structure s
LEFT JOIN moz_bookmarks_synced child ON child.guid = s.guid
LEFT JOIN moz_bookmarks_synced parent ON parent.guid = s.parentGuid
WHERE s.guid <> ?
Contributor
There was a problem hiding this comment.
Actually while thinking about it more we could also just do:
SELECT
SUM(child.isDeleted IS 1),
SUM(child.guid IS NULL),
SUM(parent.isDeleted IS 1),
SUM(parent.guid IS NULL),
SUM(parent.isDeleted IS 0 AND parent.kind <> ?)
FROM moz_bookmarks_synced_structure s
LEFT JOIN moz_bookmarks_synced child ON child.guid = s.guid
LEFT JOIN moz_bookmarks_synced parent ON parent.guid = s.parentGuid
WHERE s.guid <> ?
Then we can know exactly how many rows are tombstoned? Idk if we really care about that though in regards to what you're trying to actually do.
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.
moz_bookmarks_synced_structure rows can accumulate with tombstoned/absent or non-folder parent endpoints. The strict dogear by_children call in pass 3 of fetch_remote_tree would fail on these with MissingParentForUnknownChild or InvalidParent respectively.
Workaround: join against moz_bookmarks_synced to both report and skip rows whose endpoints are tombstoned/absent or whose parent is not a folder.
report_error!so we can learn more about what's wrong.Note this is on top of #7372.