summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-10-22 11:20:11 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-10-22 12:10:29 +0300
commitb906792ad71eaa140015eb120f318fecd57507b6 (patch)
tree72370e9268acefacd323e972b0aad72af568ee53
parent4b76925f3c033c9ea17b7cca55976be51f0a53df (diff)
downloadqtlocation-mapboxgl-upstream/mikhail_incremental_vacuum.tar.gz
[core] Version 7 for offline databaseupstream/mikhail_incremental_vacuum
The newly introduced version puts in place `auto_vacuum = INCREMENTAL` and provides migration from the older versions.
-rw-r--r--platform/default/include/mbgl/storage/offline_database.hpp1
-rw-r--r--platform/default/src/mbgl/storage/offline_database.cpp15
-rw-r--r--test/fixtures/offline_database/corrupt-delayed.dbbin19456 -> 19456 bytes
-rw-r--r--test/fixtures/offline_database/offline_sideload.dbbin73728 -> 73728 bytes
-rw-r--r--test/fixtures/offline_database/satellite_test.dbbin114688 -> 114688 bytes
-rw-r--r--test/fixtures/offline_database/sideload_ambient.dbbin90112 -> 90112 bytes
-rw-r--r--test/fixtures/offline_database/sideload_sat.dbbin73728 -> 73728 bytes
-rw-r--r--test/fixtures/offline_database/sideload_sat_multiple.dbbin90112 -> 90112 bytes
-rw-r--r--test/fixtures/offline_database/v6.dbbin0 -> 61440 bytes
-rw-r--r--test/storage/offline_database.test.cpp62
10 files changed, 71 insertions, 7 deletions
diff --git a/platform/default/include/mbgl/storage/offline_database.hpp b/platform/default/include/mbgl/storage/offline_database.hpp
index 96b867eaa6..f8efe7acf4 100644
--- a/platform/default/include/mbgl/storage/offline_database.hpp
+++ b/platform/default/include/mbgl/storage/offline_database.hpp
@@ -106,6 +106,7 @@ private:
void migrateToVersion5();
void migrateToVersion3();
void migrateToVersion6();
+ void migrateToVersion7();
void cleanup();
bool disabled();
diff --git a/platform/default/src/mbgl/storage/offline_database.cpp b/platform/default/src/mbgl/storage/offline_database.cpp
index e27ccbf313..f17bd697ca 100644
--- a/platform/default/src/mbgl/storage/offline_database.cpp
+++ b/platform/default/src/mbgl/storage/offline_database.cpp
@@ -59,6 +59,9 @@ void OfflineDatabase::initialize() {
migrateToVersion6();
// fall through
case 6:
+ migrateToVersion7();
+ // fall through
+ case 7:
// Happy path; we're done
return;
default:
@@ -151,7 +154,7 @@ void OfflineDatabase::createSchema() {
db->exec("PRAGMA synchronous = FULL");
mapbox::sqlite::Transaction transaction(*db);
db->exec(offlineDatabaseSchema);
- db->exec("PRAGMA user_version = 6");
+ db->exec("PRAGMA user_version = 7");
transaction.commit();
}
@@ -184,6 +187,16 @@ void OfflineDatabase::migrateToVersion6() {
transaction.commit();
}
+void OfflineDatabase::migrateToVersion7() {
+ assert(db);
+ if (getPragma<int64_t>("PRAGMA auto_vacuum") != 2) {
+ // auto_vacuum might have been already set to INCREMENTAL at migrateToVersion3()
+ db->exec("PRAGMA auto_vacuum = INCREMENTAL");
+ db->exec("VACUUM");
+ }
+ db->exec("PRAGMA user_version = 7");
+}
+
mapbox::sqlite::Statement& OfflineDatabase::getStatement(const char* sql) {
if (!db) {
initialize();
diff --git a/test/fixtures/offline_database/corrupt-delayed.db b/test/fixtures/offline_database/corrupt-delayed.db
index 04989dbf36..9019b81ef2 100644
--- a/test/fixtures/offline_database/corrupt-delayed.db
+++ b/test/fixtures/offline_database/corrupt-delayed.db
Binary files differ
diff --git a/test/fixtures/offline_database/offline_sideload.db b/test/fixtures/offline_database/offline_sideload.db
index 6146e30872..6d1528a333 100644
--- a/test/fixtures/offline_database/offline_sideload.db
+++ b/test/fixtures/offline_database/offline_sideload.db
Binary files differ
diff --git a/test/fixtures/offline_database/satellite_test.db b/test/fixtures/offline_database/satellite_test.db
index 95dd8617ff..023cabcffc 100644
--- a/test/fixtures/offline_database/satellite_test.db
+++ b/test/fixtures/offline_database/satellite_test.db
Binary files differ
diff --git a/test/fixtures/offline_database/sideload_ambient.db b/test/fixtures/offline_database/sideload_ambient.db
index 5f10a23c61..9c9f7a8041 100644
--- a/test/fixtures/offline_database/sideload_ambient.db
+++ b/test/fixtures/offline_database/sideload_ambient.db
Binary files differ
diff --git a/test/fixtures/offline_database/sideload_sat.db b/test/fixtures/offline_database/sideload_sat.db
index 6146e30872..6d1528a333 100644
--- a/test/fixtures/offline_database/sideload_sat.db
+++ b/test/fixtures/offline_database/sideload_sat.db
Binary files differ
diff --git a/test/fixtures/offline_database/sideload_sat_multiple.db b/test/fixtures/offline_database/sideload_sat_multiple.db
index 0a74be5ff9..35c02c498a 100644
--- a/test/fixtures/offline_database/sideload_sat_multiple.db
+++ b/test/fixtures/offline_database/sideload_sat_multiple.db
Binary files differ
diff --git a/test/fixtures/offline_database/v6.db b/test/fixtures/offline_database/v6.db
new file mode 100644
index 0000000000..f19e639933
--- /dev/null
+++ b/test/fixtures/offline_database/v6.db
Binary files differ
diff --git a/test/storage/offline_database.test.cpp b/test/storage/offline_database.test.cpp
index 24234b0624..bcbc1af50b 100644
--- a/test/storage/offline_database.test.cpp
+++ b/test/storage/offline_database.test.cpp
@@ -92,6 +92,14 @@ static std::vector<std::string> databaseTableColumns(const std::string& path, co
return columns;
}
+static int databaseAutoVacuum(const std::string& path) {
+ mapbox::sqlite::Database db = mapbox::sqlite::Database::open(path, mapbox::sqlite::ReadOnly);
+ mapbox::sqlite::Statement stmt{db, "pragma auto_vacuum"};
+ mapbox::sqlite::Query query{stmt};
+ query.run();
+ return query.get<int>(0);
+}
+
namespace fixture {
const Resource resource{ Resource::Style, "mapbox://test" };
@@ -219,7 +227,7 @@ TEST(OfflineDatabase, TEST_REQUIRES_WRITE(SchemaVersion)) {
OfflineDatabase db(filename);
}
- EXPECT_EQ(6, databaseUserVersion(filename));
+ EXPECT_EQ(7, databaseUserVersion(filename));
OfflineDatabase db(filename);
// Now try inserting and reading back to make sure we have a valid database.
@@ -1286,7 +1294,7 @@ TEST(OfflineDatabase, MigrateFromV2Schema) {
}
}
- EXPECT_EQ(6, databaseUserVersion(filename));
+ EXPECT_EQ(7, databaseUserVersion(filename));
EXPECT_LT(databasePageCount(filename),
databasePageCount("test/fixtures/offline_database/v2.db"));
@@ -1309,7 +1317,7 @@ TEST(OfflineDatabase, MigrateFromV3Schema) {
}
}
- EXPECT_EQ(6, databaseUserVersion(filename));
+ EXPECT_EQ(7, databaseUserVersion(filename));
EXPECT_EQ(0u, log.uncheckedCount());
}
@@ -1330,7 +1338,7 @@ TEST(OfflineDatabase, MigrateFromV4Schema) {
}
}
- EXPECT_EQ(6, databaseUserVersion(filename));
+ EXPECT_EQ(7, databaseUserVersion(filename));
// Journal mode should be DELETE after migration to v5.
EXPECT_EQ("delete", databaseJournalMode(filename));
@@ -1358,7 +1366,49 @@ TEST(OfflineDatabase, MigrateFromV5Schema) {
}
}
- EXPECT_EQ(6, databaseUserVersion(filename));
+ EXPECT_EQ(7, databaseUserVersion(filename));
+
+ EXPECT_EQ((std::vector<std::string>{"id",
+ "url_template",
+ "pixel_ratio",
+ "z",
+ "x",
+ "y",
+ "expires",
+ "modified",
+ "etag",
+ "data",
+ "compressed",
+ "accessed",
+ "must_revalidate"}),
+ databaseTableColumns(filename, "tiles"));
+ EXPECT_EQ(
+ (std::vector<std::string>{
+ "id", "url", "kind", "expires", "modified", "etag", "data", "compressed", "accessed", "must_revalidate"}),
+ databaseTableColumns(filename, "resources"));
+
+ EXPECT_EQ(0u, log.uncheckedCount());
+}
+
+TEST(OfflineDatabase, MigrateFromV6Schema) {
+ // v6.db is a v6 database, initially created as v6.
+ FixtureLog log;
+ deleteDatabaseFiles();
+ util::copyFile(filename, "test/fixtures/offline_database/v6.db");
+ EXPECT_EQ(0, databaseAutoVacuum(filename));
+
+ {
+ OfflineDatabase db(filename);
+ db.setMaximumAmbientCacheSize(0);
+
+ auto regions = db.listRegions().value();
+ for (auto& region : regions) {
+ db.deleteRegion(std::move(region));
+ }
+ }
+
+ EXPECT_EQ(7, databaseUserVersion(filename));
+ EXPECT_EQ(2, databaseAutoVacuum(filename));
EXPECT_EQ((std::vector<std::string>{ "id", "url_template", "pixel_ratio", "z", "x", "y",
"expires", "modified", "etag", "data", "compressed",
@@ -1383,7 +1433,7 @@ TEST(OfflineDatabase, DowngradeSchema) {
db.setMaximumAmbientCacheSize(0);
}
- EXPECT_EQ(6, databaseUserVersion(filename));
+ EXPECT_EQ(7, databaseUserVersion(filename));
EXPECT_EQ((std::vector<std::string>{ "id", "url_template", "pixel_ratio", "z", "x", "y",
"expires", "modified", "etag", "data", "compressed",