зеркало из https://github.com/mozilla/gecko-dev.git
Backed out changeset 6baa1883dc72 (bug 1559029) for ES Lint failure.
This commit is contained in:
Родитель
a7f81b45b5
Коммит
94dd792600
|
@ -1433,12 +1433,6 @@ class Connection final {
|
|||
|
||||
void AssertIsOnOwningThread() const { NS_ASSERT_OWNINGTHREAD(Connection); }
|
||||
|
||||
QuotaClient* GetQuotaClient() const {
|
||||
MOZ_ASSERT(mQuotaClient);
|
||||
|
||||
return mQuotaClient;
|
||||
}
|
||||
|
||||
ArchivedOriginScope* GetArchivedOriginScope() const {
|
||||
return mArchivedOriginScope;
|
||||
}
|
||||
|
@ -1485,12 +1479,6 @@ class Connection final {
|
|||
nsresult GetCachedStatement(const nsACString& aQuery,
|
||||
CachedStatement* aCachedStatement);
|
||||
|
||||
nsresult BeginWriteTransaction();
|
||||
|
||||
nsresult CommitWriteTransaction();
|
||||
|
||||
nsresult RollbackWriteTransaction();
|
||||
|
||||
private:
|
||||
// Only created by ConnectionThread.
|
||||
Connection(ConnectionThread* aConnectionThread, const nsACString& aSuffix,
|
||||
|
@ -2831,30 +2819,6 @@ class QuotaClient::MatchFunction final : public mozIStorageFunction {
|
|||
NS_DECL_MOZISTORAGEFUNCTION
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
* Helper classes
|
||||
******************************************************************************/
|
||||
|
||||
class MOZ_STACK_CLASS AutoWriteTransaction final {
|
||||
Connection* mConnection;
|
||||
Maybe<MutexAutoLock> mShadowDatabaseLock;
|
||||
bool mShadowWrites;
|
||||
|
||||
public:
|
||||
explicit AutoWriteTransaction(bool aShadowWrites);
|
||||
|
||||
~AutoWriteTransaction();
|
||||
|
||||
nsresult Start(Connection* aConnection);
|
||||
|
||||
nsresult Commit();
|
||||
|
||||
private:
|
||||
nsresult LockAndAttachShadowDatabase(Connection* aConnection);
|
||||
|
||||
nsresult DetachShadowDatabaseAndUnlock();
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
* Globals
|
||||
******************************************************************************/
|
||||
|
@ -4378,60 +4342,6 @@ nsresult Connection::GetCachedStatement(const nsACString& aQuery,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult Connection::BeginWriteTransaction() {
|
||||
AssertIsOnConnectionThread();
|
||||
MOZ_ASSERT(mStorageConnection);
|
||||
|
||||
CachedStatement stmt;
|
||||
nsresult rv = GetCachedStatement(NS_LITERAL_CSTRING("BEGIN IMMEDIATE;"),
|
||||
&stmt);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = stmt->Execute();
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult Connection::CommitWriteTransaction() {
|
||||
AssertIsOnConnectionThread();
|
||||
MOZ_ASSERT(mStorageConnection);
|
||||
|
||||
CachedStatement stmt;
|
||||
nsresult rv = GetCachedStatement(NS_LITERAL_CSTRING("COMMIT;"), &stmt);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = stmt->Execute();
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult Connection::RollbackWriteTransaction() {
|
||||
AssertIsOnConnectionThread();
|
||||
MOZ_ASSERT(mStorageConnection);
|
||||
|
||||
CachedStatement stmt;
|
||||
nsresult rv = GetCachedStatement(NS_LITERAL_CSTRING("ROLLBACK;"), &stmt);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
// This may fail if SQLite already rolled back the transaction so ignore any
|
||||
// errors.
|
||||
Unused << stmt->Execute();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void Connection::ScheduleFlush() {
|
||||
AssertIsOnOwningThread();
|
||||
MOZ_ASSERT(mWriteOptimizer.HasWrites());
|
||||
|
@ -4587,9 +4497,69 @@ nsresult Connection::FlushOp::DoDatastoreWork() {
|
|||
AssertIsOnConnectionThread();
|
||||
MOZ_ASSERT(mConnection);
|
||||
|
||||
AutoWriteTransaction autoWriteTransaction(mShadowWrites);
|
||||
class MOZ_STACK_CLASS AutoDetach final {
|
||||
nsCOMPtr<mozIStorageConnection> mConnection;
|
||||
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
|
||||
|
||||
nsresult rv = autoWriteTransaction.Start(mConnection);
|
||||
public:
|
||||
explicit AutoDetach(
|
||||
mozIStorageConnection* aConnection MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
|
||||
: mConnection(aConnection) {
|
||||
MOZ_ASSERT(aConnection);
|
||||
|
||||
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
|
||||
}
|
||||
|
||||
~AutoDetach() {
|
||||
if (mConnection) {
|
||||
nsresult rv = DetachShadowDatabase(mConnection);
|
||||
Unused << NS_WARN_IF(NS_FAILED(rv));
|
||||
}
|
||||
}
|
||||
|
||||
void release() { mConnection = nullptr; }
|
||||
|
||||
private:
|
||||
explicit AutoDetach(const AutoDetach&) = delete;
|
||||
AutoDetach& operator=(const AutoDetach&) = delete;
|
||||
AutoDetach& operator=(AutoDetach&&) = delete;
|
||||
};
|
||||
|
||||
QuotaManager* quotaManager = QuotaManager::Get();
|
||||
MOZ_ASSERT(quotaManager);
|
||||
|
||||
nsCOMPtr<mozIStorageConnection> storageConnection =
|
||||
mConnection->StorageConnection();
|
||||
MOZ_ASSERT(storageConnection);
|
||||
|
||||
nsresult rv;
|
||||
|
||||
Maybe<MutexAutoLock> shadowDatabaseLock;
|
||||
|
||||
Maybe<AutoDetach> autoDetach;
|
||||
|
||||
if (mShadowWrites) {
|
||||
MOZ_ASSERT(mConnection->mQuotaClient);
|
||||
|
||||
shadowDatabaseLock.emplace(
|
||||
mConnection->mQuotaClient->ShadowDatabaseMutex());
|
||||
|
||||
rv = AttachShadowDatabase(quotaManager->GetBasePath(), storageConnection);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
autoDetach.emplace(storageConnection);
|
||||
}
|
||||
|
||||
CachedStatement stmt;
|
||||
rv = mConnection->GetCachedStatement(NS_LITERAL_CSTRING("BEGIN IMMEDIATE;"),
|
||||
&stmt);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = stmt->Execute();
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
@ -4618,19 +4588,34 @@ nsresult Connection::FlushOp::DoDatastoreWork() {
|
|||
return rv;
|
||||
}
|
||||
|
||||
rv = autoWriteTransaction.Commit();
|
||||
rv = mConnection->GetCachedStatement(NS_LITERAL_CSTRING("COMMIT;"), &stmt);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = stmt->Execute();
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (mShadowWrites) {
|
||||
autoDetach->release();
|
||||
|
||||
rv = DetachShadowDatabase(storageConnection);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
autoDetach.reset();
|
||||
|
||||
shadowDatabaseLock.reset();
|
||||
}
|
||||
|
||||
rv = usageJournalFile->Remove(false);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
QuotaManager* quotaManager = QuotaManager::Get();
|
||||
MOZ_ASSERT(quotaManager);
|
||||
|
||||
RefPtr<Runnable> runnable =
|
||||
NS_NewRunnableFunction("dom::localstorage::UpdateUsageRunnable",
|
||||
[origin = mConnection->Origin(), usage]() {
|
||||
|
@ -9366,124 +9351,5 @@ QuotaClient::MatchFunction::OnFunctionCall(
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* AutoWriteTransaction
|
||||
******************************************************************************/
|
||||
|
||||
AutoWriteTransaction::AutoWriteTransaction(bool aShadowWrites)
|
||||
: mConnection(nullptr)
|
||||
, mShadowWrites(aShadowWrites)
|
||||
{
|
||||
AssertIsOnConnectionThread();
|
||||
|
||||
MOZ_COUNT_CTOR(mozilla::dom::AutoWriteTransaction);
|
||||
}
|
||||
|
||||
AutoWriteTransaction::~AutoWriteTransaction() {
|
||||
AssertIsOnConnectionThread();
|
||||
|
||||
MOZ_COUNT_DTOR(mozilla::dom::AutoWriteTransaction);
|
||||
|
||||
if (mConnection) {
|
||||
if (NS_FAILED(mConnection->RollbackWriteTransaction())) {
|
||||
NS_WARNING("Failed to rollback write transaction!");
|
||||
}
|
||||
|
||||
if (mShadowWrites && NS_FAILED(DetachShadowDatabaseAndUnlock())) {
|
||||
NS_WARNING("Failed to detach shadow database!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nsresult AutoWriteTransaction::Start(Connection* aConnection) {
|
||||
AssertIsOnConnectionThread();
|
||||
MOZ_ASSERT(aConnection);
|
||||
MOZ_ASSERT(!mConnection);
|
||||
|
||||
nsresult rv;
|
||||
|
||||
if (mShadowWrites) {
|
||||
rv = LockAndAttachShadowDatabase(aConnection);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
rv = aConnection->BeginWriteTransaction();
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
mConnection = aConnection;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult AutoWriteTransaction::Commit() {
|
||||
AssertIsOnConnectionThread();
|
||||
MOZ_ASSERT(mConnection);
|
||||
|
||||
nsresult rv = mConnection->CommitWriteTransaction();
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (mShadowWrites) {
|
||||
rv = DetachShadowDatabaseAndUnlock();
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
mConnection = nullptr;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult AutoWriteTransaction::LockAndAttachShadowDatabase(Connection* aConnection) {
|
||||
AssertIsOnConnectionThread();
|
||||
MOZ_ASSERT(aConnection);
|
||||
MOZ_ASSERT(!mConnection);
|
||||
MOZ_ASSERT(mShadowDatabaseLock.isNothing());
|
||||
MOZ_ASSERT(mShadowWrites);
|
||||
|
||||
QuotaManager* quotaManager = QuotaManager::Get();
|
||||
MOZ_ASSERT(quotaManager);
|
||||
|
||||
nsCOMPtr<mozIStorageConnection> storageConnection =
|
||||
aConnection->StorageConnection();
|
||||
MOZ_ASSERT(storageConnection);
|
||||
|
||||
mShadowDatabaseLock.emplace(
|
||||
aConnection->GetQuotaClient()->ShadowDatabaseMutex());
|
||||
|
||||
nsresult rv = AttachShadowDatabase(quotaManager->GetBasePath(), storageConnection);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult AutoWriteTransaction::DetachShadowDatabaseAndUnlock() {
|
||||
AssertIsOnConnectionThread();
|
||||
MOZ_ASSERT(mConnection);
|
||||
MOZ_ASSERT(mShadowDatabaseLock.isSome());
|
||||
MOZ_ASSERT(mShadowWrites);
|
||||
|
||||
nsCOMPtr<mozIStorageConnection> storageConnection =
|
||||
mConnection->StorageConnection();
|
||||
MOZ_ASSERT(storageConnection);
|
||||
|
||||
nsresult rv = DetachShadowDatabase(storageConnection);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
mShadowDatabaseLock.reset();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
|
|
@ -85,18 +85,6 @@ function resetOriginLimit() {
|
|||
Services.prefs.clearUserPref("dom.storage.default_quota");
|
||||
}
|
||||
|
||||
function setTimeout(callback, timeout) {
|
||||
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||
|
||||
timer.initWithCallback({
|
||||
notify(timer) {
|
||||
callback();
|
||||
},
|
||||
}, timeout, Ci.nsITimer.TYPE_ONE_SHOT);
|
||||
|
||||
return timer;
|
||||
}
|
||||
|
||||
function init() {
|
||||
let request = Services.qms.init();
|
||||
|
||||
|
|
|
@ -1,67 +0,0 @@
|
|||
/**
|
||||
* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
/* eslint-disable mozilla/no-arbitrary-setTimeout */
|
||||
|
||||
/**
|
||||
* This test is mainly to verify that the flush operation detaches the shadow
|
||||
* database in the event of early return due to error. See bug 1559029.
|
||||
*/
|
||||
|
||||
async function testSteps() {
|
||||
const principal1 = getPrincipal("http://example1.com");
|
||||
|
||||
const usageFile1 =
|
||||
getRelativeFile("storage/default/http+++example1.com/ls/usage");
|
||||
|
||||
const principal2 = getPrincipal("http://example2.com");
|
||||
|
||||
const data = {
|
||||
key: "foo",
|
||||
value: "bar",
|
||||
};
|
||||
|
||||
const flushSleepTimeSec = 6;
|
||||
|
||||
info("Setting prefs");
|
||||
|
||||
Services.prefs.setBoolPref("dom.storage.next_gen", true);
|
||||
|
||||
info("Getting storage 1");
|
||||
|
||||
let storage1 = getLocalStorage(principal1);
|
||||
|
||||
info("Adding item");
|
||||
|
||||
storage1.setItem(data.key, data.value);
|
||||
|
||||
info("Creating usage as a directory");
|
||||
|
||||
// This will cause a failure during the flush for first principal.
|
||||
usageFile1.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt("0755", 8));
|
||||
|
||||
info("Getting storage 2");
|
||||
|
||||
let storage2 = getLocalStorage(principal2);
|
||||
|
||||
info("Adding item");
|
||||
|
||||
storage2.setItem(data.key, data.value);
|
||||
|
||||
// The flush for second principal shouldn't be affected by failed flush for
|
||||
// first principal.
|
||||
|
||||
info("Sleeping for " + flushSleepTimeSec + " seconds to let all flushes " +
|
||||
"finish");
|
||||
|
||||
await new Promise(function(resolve) {
|
||||
setTimeout(resolve, flushSleepTimeSec * 1000);
|
||||
});
|
||||
|
||||
info("Resetting");
|
||||
|
||||
// Wait for all database connections to close.
|
||||
let request = reset();
|
||||
await requestFinished(request);
|
||||
}
|
|
@ -33,7 +33,6 @@ run-sequentially = test_databaseShadowing_clearOriginsByPrefix2.js depends on a
|
|||
[test_databaseShadowing_clearOriginsByPrefix2.js]
|
||||
run-sequentially = this test depends on a file produced by test_databaseShadowing_clearOriginsByPrefix1.js
|
||||
[test_eviction.js]
|
||||
[test_flushing.js]
|
||||
[test_groupLimit.js]
|
||||
[test_groupMismatch.js]
|
||||
[test_largeItems.js]
|
||||
|
|
Загрузка…
Ссылка в новой задаче