diff --git a/toolkit/components/places/Database.cpp b/toolkit/components/places/Database.cpp index 154196a428e..7a263e7d65e 100644 --- a/toolkit/components/places/Database.cpp +++ b/toolkit/components/places/Database.cpp @@ -49,6 +49,9 @@ #define BYTES_PER_KIBIBYTE 1024 +// How much time Sqlite can wait before returning a SQLITE_BUSY error. +#define DATABASE_BUSY_TIMEOUT_MS 100 + // Old Sync GUID annotation. #define SYNCGUID_ANNO NS_LITERAL_CSTRING("sync/guid") @@ -597,6 +600,10 @@ Database::InitSchema(bool* aDatabaseMigrated) (void)mMainConn->SetGrowthIncrement(growthIncrementKiB * BYTES_PER_KIBIBYTE, EmptyCString()); } + nsAutoCString busyTimeoutPragma("PRAGMA busy_timeout = "); + busyTimeoutPragma.AppendInt(DATABASE_BUSY_TIMEOUT_MS); + (void)mMainConn->ExecuteSimpleSQL(busyTimeoutPragma); + // We use our functions during migration, so initialize them now. rv = InitFunctions(); NS_ENSURE_SUCCESS(rv, rv); @@ -1210,8 +1217,6 @@ Database::MigrateV7Up() return NS_ERROR_FILE_CORRUPTED; } - mozStorageTransaction transaction(mMainConn, false); - // We need an index on lastModified to catch quickly last modified bookmark // title for tag container's children. This will be useful for Sync, too. bool lastModIndexExists = false; @@ -1391,7 +1396,7 @@ Database::MigrateV7Up() NS_ENSURE_SUCCESS(rv, rv); } - return transaction.Commit(); + return NS_OK; } @@ -1399,7 +1404,6 @@ nsresult Database::MigrateV8Up() { MOZ_ASSERT(NS_IsMainThread()); - mozStorageTransaction transaction(mMainConn, false); nsresult rv = mMainConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING( "DROP TRIGGER IF EXISTS moz_historyvisits_afterinsert_v1_trigger")); @@ -1445,7 +1449,7 @@ Database::MigrateV8Up() NS_ENSURE_SUCCESS(rv, rv); } - return transaction.Commit(); + return NS_OK; } @@ -1453,7 +1457,6 @@ nsresult Database::MigrateV9Up() { MOZ_ASSERT(NS_IsMainThread()); - mozStorageTransaction transaction(mMainConn, false); // Added in Bug 488966. The last_visit_date column caches the last // visit date, this enhances SELECT performances when we // need to sort visits by visit date. @@ -1485,7 +1488,7 @@ Database::MigrateV9Up() NS_ENSURE_SUCCESS(rv, rv); } - return transaction.Commit(); + return NS_OK; } diff --git a/toolkit/components/places/nsNavHistory.cpp b/toolkit/components/places/nsNavHistory.cpp index 9886ac651d3..6aa14e4d91d 100644 --- a/toolkit/components/places/nsNavHistory.cpp +++ b/toolkit/components/places/nsNavHistory.cpp @@ -2267,7 +2267,9 @@ nsresult nsNavHistory::BeginUpdateBatch() { if (mBatchLevel++ == 0) { - mBatchDBTransaction = new mozStorageTransaction(mDB->MainConn(), false); + mBatchDBTransaction = new mozStorageTransaction(mDB->MainConn(), false, + mozIStorageConnection::TRANSACTION_DEFERRED, + true); NOTIFY_OBSERVERS(mCanNotify, mCacheObservers, mObservers, nsINavHistoryObserver, OnBeginUpdateBatch()); @@ -2332,7 +2334,9 @@ nsNavHistory::RemovePagesInternal(const nsCString& aPlaceIdsQueryString) if (aPlaceIdsQueryString.IsEmpty()) return NS_OK; - mozStorageTransaction transaction(mDB->MainConn(), false); + mozStorageTransaction transaction(mDB->MainConn(), false, + mozIStorageConnection::TRANSACTION_DEFERRED, + true); // Delete all visits for the specified place ids. nsresult rv = mDB->MainConn()->ExecuteSimpleSQL( @@ -2724,7 +2728,9 @@ nsNavHistory::RemoveVisitsByTimeframe(PRTime aBeginTime, PRTime aEndTime) // force a full refresh calling onEndUpdateBatch (will call Refresh()) UpdateBatchScoper batch(*this); // sends Begin/EndUpdateBatch to observers - mozStorageTransaction transaction(mDB->MainConn(), false); + mozStorageTransaction transaction(mDB->MainConn(), false, + mozIStorageConnection::TRANSACTION_DEFERRED, + true); // Delete all visits within the timeframe. nsCOMPtr deleteVisitsStmt = mDB->GetStatement( diff --git a/toolkit/components/places/tests/bookmarks/test_1017502-bookmarks_foreign_count.js b/toolkit/components/places/tests/bookmarks/test_1017502-bookmarks_foreign_count.js index d2046620d2b..70bb9db9ad3 100644 --- a/toolkit/components/places/tests/bookmarks/test_1017502-bookmarks_foreign_count.js +++ b/toolkit/components/places/tests/bookmarks/test_1017502-bookmarks_foreign_count.js @@ -11,7 +11,8 @@ added or removed and also the maintenance task to fix wrong counts. const T_URI = NetUtil.newURI("https://www.mozilla.org/firefox/nightly/firstrun/"); -function* getForeignCountForURL(conn, url){ +function* getForeignCountForURL(conn, url) { + yield promiseAsyncUpdates(); let url = url instanceof Ci.nsIURI ? url.spec : url; let rows = yield conn.executeCached( "SELECT foreign_count FROM moz_places WHERE url = :t_url ", { t_url: url }); @@ -106,4 +107,4 @@ add_task(function* add_remove_tags_test(){ // Check foreign count is set to 0 when all tags are removed PlacesUtils.tagging.untagURI(T_URI, ["test tag", "one", "two"]); Assert.equal((yield getForeignCountForURL(conn, T_URI)), 0); -}); \ No newline at end of file +});