Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/**
* Any copyright is dedicated to the Public Domain.
*/
/* exported testSteps */
async function testSteps() {
// A constant used to deal with small decrease in usage when transactions are
// transferred from the WAL file back into the original database, also called
// as checkpointing.
const cosmologicalConstant = 20000;
// The length of time that database connections will be held open after all
// transactions have completed before doing idle maintenance.
const connectionIdleMaintenanceMS = 2 * 1000;
const name = "test_connection_idle_maintenance";
const abc = "abcdefghijklmnopqrstuvwxyz";
// IndexedDB on Android does `PRAGMA auto_vacuum = FULL`, so the freelist
// pages are moved to the end of the database file and the database file is
// truncated to remove the freelist pages at every transaction commit.
if (mozinfo.os == "android") {
info("Test disabled on Android for now");
return;
}
info("Creating database");
let request = indexedDB.open(name, 1);
let event = await expectingUpgrade(request);
let database = event.target.result;
let objectStore = database.createObjectStore(name);
// Add lots of data...
for (let i = 0; i < 10000; i++) {
objectStore.add(abc, i);
}
// And then clear it so that maintenance has some space to reclaim.
objectStore.clear();
await expectingSuccess(request);
info("Getting database usage before maintenance");
let databaseUsageBeforeMaintenance = await new Promise(function (resolve) {
getCurrentUsage(function (request) {
resolve(request.result.databaseUsage);
});
});
info("Waiting for maintenance to start");
// This time is a double of connectionIdleMaintenanceMS which should be
// pessimistic enough to work with randomly slowed down threads in the chaos
// mode.
await new Promise(function (resolve) {
do_timeout(2 * connectionIdleMaintenanceMS, resolve);
});
info("Waiting for maintenance to finish");
// This time is a double of connectionIdleMaintenanceMS which should be
// pessimistic enough to work with randomly slowed down threads in the chaos
// mode.
await new Promise(function (resolve) {
do_timeout(2 * connectionIdleMaintenanceMS, resolve);
});
info("Getting database usage after maintenance");
let databaseUsageAfterMaintenance = await new Promise(function (resolve) {
getCurrentUsage(function (request) {
resolve(request.result.databaseUsage);
});
});
info(
"Database usage before: " +
databaseUsageBeforeMaintenance +
". " +
"Database usage after: " +
databaseUsageAfterMaintenance
);
// Checkpointing done immediately after the maintenance can slightly decrease
// the usage even when the maintenance was not run at all.
ok(
databaseUsageBeforeMaintenance - databaseUsageAfterMaintenance >=
cosmologicalConstant,
"Maintenance significantly decreased database usage"
);
}