Backed out changeset 6baa1883dc72 (bug 1559029) for ES Lint failure.

This commit is contained in:
Razvan Maries 2019-06-13 07:33:58 +03:00
Родитель a7f81b45b5
Коммит 94dd792600
4 изменённых файлов: 81 добавлений и 295 удалений

Просмотреть файл

@ -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]