Bug 1376149 - Speed up orphan favicons cleanups on history removals. r=Paolo

MozReview-Commit-ID: 1XTmpvdUnLm

--HG--
extra : rebase_source : 86b9289d24874f8a10160b00778298ae537ded29
This commit is contained in:
Marco Bonardo 2017-10-24 01:35:07 +02:00
parent d36ed8080b
commit c1bf47f3f2
3 changed files with 46 additions and 31 deletions

View File

@ -774,8 +774,11 @@ var clear = async function(db) {
// Expire orphan icons.
await db.executeCached(`DELETE FROM moz_pages_w_icons
WHERE page_url_hash NOT IN (SELECT url_hash FROM moz_places)`);
await db.executeCached(`DELETE FROM moz_icons
WHERE root = 0 AND id NOT IN (SELECT icon_id FROM moz_icons_to_pages)`);
await db.executeCached(`DELETE FROM moz_icons WHERE id IN (
SELECT id FROM moz_icons WHERE root = 0
EXCEPT
SELECT icon_id FROM moz_icons_to_pages
)`);
// Expire annotations.
await db.execute(`DELETE FROM moz_items_annos WHERE expiration = :expire_session`,
@ -843,9 +846,11 @@ var clear = async function(db) {
var cleanupPages = async function(db, pages) {
await invalidateFrecencies(db, pages.filter(p => p.hasForeign || p.hasVisits).map(p => p.id));
let pageIdsToRemove = pages.filter(p => !p.hasForeign && !p.hasVisits).map(p => p.id);
if (pageIdsToRemove.length > 0) {
let idsList = sqlList(pageIdsToRemove);
let pagesToRemove = pages.filter(p => !p.hasForeign && !p.hasVisits);
if (pagesToRemove.length == 0)
return;
let idsList = sqlList(pagesToRemove.map(p => p.id));
// Note, we are already in a transaction, since callers create it.
// Check relations regardless, to avoid creating orphans in case of
// async race conditions.
@ -856,15 +861,19 @@ var cleanupPages = async function(db, pages) {
await db.executeCached(`DELETE FROM moz_updatehosts_temp`);
// Expire orphans.
let hashesToRemove = pagesToRemove.map(p => p.hash);
await db.executeCached(`DELETE FROM moz_pages_w_icons
WHERE page_url_hash NOT IN (SELECT url_hash FROM moz_places)`);
await db.executeCached(`DELETE FROM moz_icons
WHERE root = 0 AND id NOT IN (SELECT icon_id FROM moz_icons_to_pages)`);
WHERE page_url_hash IN (${sqlList(hashesToRemove)})`);
await db.executeCached(`DELETE FROM moz_icons WHERE id IN (
SELECT id FROM moz_icons WHERE root = 0
EXCEPT
SELECT icon_id FROM moz_icons_to_pages
)`);
await db.execute(`DELETE FROM moz_annos
WHERE place_id IN ( ${ idsList } )`);
await db.execute(`DELETE FROM moz_inputhistory
WHERE place_id IN ( ${ idsList } )`);
}
};
/**
@ -1082,7 +1091,7 @@ var removeVisitsByFilter = async function(db, filter, onResult = null) {
// 3. Find out which pages have been orphaned
await db.execute(
`SELECT id, url, guid,
`SELECT id, url, url_hash, guid,
(foreign_count != 0) AS has_foreign,
(last_visit_date NOTNULL) as has_visits
FROM moz_places
@ -1095,6 +1104,7 @@ var removeVisitsByFilter = async function(db, filter, onResult = null) {
hasForeign: row.getResultByName("has_foreign"),
hasVisits: row.getResultByName("has_visits"),
url: new URL(row.getResultByName("url")),
hash: row.getResultByName("url_hash"),
};
pages.push(page);
});
@ -1161,7 +1171,7 @@ var removeByFilter = async function(db, filter, onResult = null) {
// 3. Find out what needs to be removed
let fragmentArray = [hostFilterSQLFragment, dateFilterSQLFragment];
let query =
`SELECT h.id, url, rev_host, guid, title, frecency, foreign_count
`SELECT h.id, url, url_hash, rev_host, guid, title, frecency, foreign_count
FROM moz_places h WHERE
(${ fragmentArray.filter(f => f !== "").join(") AND (") })`;
let onResultData = onResult ? [] : null;
@ -1184,7 +1194,8 @@ var removeByFilter = async function(db, filter, onResult = null) {
guid,
hasForeign,
hasVisits: false,
url: new URL(url)
url: new URL(url),
hash: row.getResultByName("url_hash"),
};
pages.push(page);
if (onResult) {
@ -1224,7 +1235,7 @@ var removeByFilter = async function(db, filter, onResult = null) {
var remove = async function(db, {guids, urls}, onResult = null) {
// 1. Find out what needs to be removed
let query =
`SELECT id, url, guid, foreign_count, title, frecency
`SELECT id, url, url_hash, guid, foreign_count, title, frecency
FROM moz_places
WHERE guid IN (${ sqlList(guids) })
OR (url_hash IN (${ urls.map(u => "hash(" + JSON.stringify(u) + ")").join(",") })
@ -1248,6 +1259,7 @@ var remove = async function(db, {guids, urls}, onResult = null) {
hasForeign,
hasVisits: false,
url: new URL(url),
hash: row.getResultByName("url_hash"),
};
pages.push(page);
if (onResult) {

View File

@ -714,7 +714,9 @@ this.PlacesDBUtils = {
let deleteOrphanIcons = {
query:
`DELETE FROM moz_icons WHERE root = 0 AND id NOT IN (
`DELETE FROM moz_icons WHERE id IN (
SELECT id FROM moz_icons WHERE root = 0
EXCEPT
SELECT icon_id FROM moz_icons_to_pages
)`
};

View File

@ -252,8 +252,9 @@ const EXPIRATION_QUERIES = {
// Expire orphan icons from the database.
QUERY_EXPIRE_FAVICONS: {
sql: `DELETE FROM moz_icons
WHERE root = 0 AND id NOT IN (
sql: `DELETE FROM moz_icons WHERE id IN (
SELECT id FROM moz_icons WHERE root = 0
EXCEPT
SELECT icon_id FROM moz_icons_to_pages
)`,
actions: ACTION.TIMED_OVERLIMIT | ACTION.SHUTDOWN_DIRTY |