diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-10-22 11:20:11 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-10-22 12:10:29 +0300 |
commit | b906792ad71eaa140015eb120f318fecd57507b6 (patch) | |
tree | 72370e9268acefacd323e972b0aad72af568ee53 | |
parent | 4b76925f3c033c9ea17b7cca55976be51f0a53df (diff) | |
download | qtlocation-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.hpp | 1 | ||||
-rw-r--r-- | platform/default/src/mbgl/storage/offline_database.cpp | 15 | ||||
-rw-r--r-- | test/fixtures/offline_database/corrupt-delayed.db | bin | 19456 -> 19456 bytes | |||
-rw-r--r-- | test/fixtures/offline_database/offline_sideload.db | bin | 73728 -> 73728 bytes | |||
-rw-r--r-- | test/fixtures/offline_database/satellite_test.db | bin | 114688 -> 114688 bytes | |||
-rw-r--r-- | test/fixtures/offline_database/sideload_ambient.db | bin | 90112 -> 90112 bytes | |||
-rw-r--r-- | test/fixtures/offline_database/sideload_sat.db | bin | 73728 -> 73728 bytes | |||
-rw-r--r-- | test/fixtures/offline_database/sideload_sat_multiple.db | bin | 90112 -> 90112 bytes | |||
-rw-r--r-- | test/fixtures/offline_database/v6.db | bin | 0 -> 61440 bytes | |||
-rw-r--r-- | test/storage/offline_database.test.cpp | 62 |
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 Binary files differindex 04989dbf36..9019b81ef2 100644 --- a/test/fixtures/offline_database/corrupt-delayed.db +++ b/test/fixtures/offline_database/corrupt-delayed.db diff --git a/test/fixtures/offline_database/offline_sideload.db b/test/fixtures/offline_database/offline_sideload.db Binary files differindex 6146e30872..6d1528a333 100644 --- a/test/fixtures/offline_database/offline_sideload.db +++ b/test/fixtures/offline_database/offline_sideload.db diff --git a/test/fixtures/offline_database/satellite_test.db b/test/fixtures/offline_database/satellite_test.db Binary files differindex 95dd8617ff..023cabcffc 100644 --- a/test/fixtures/offline_database/satellite_test.db +++ b/test/fixtures/offline_database/satellite_test.db diff --git a/test/fixtures/offline_database/sideload_ambient.db b/test/fixtures/offline_database/sideload_ambient.db Binary files differindex 5f10a23c61..9c9f7a8041 100644 --- a/test/fixtures/offline_database/sideload_ambient.db +++ b/test/fixtures/offline_database/sideload_ambient.db diff --git a/test/fixtures/offline_database/sideload_sat.db b/test/fixtures/offline_database/sideload_sat.db Binary files differindex 6146e30872..6d1528a333 100644 --- a/test/fixtures/offline_database/sideload_sat.db +++ b/test/fixtures/offline_database/sideload_sat.db diff --git a/test/fixtures/offline_database/sideload_sat_multiple.db b/test/fixtures/offline_database/sideload_sat_multiple.db Binary files differindex 0a74be5ff9..35c02c498a 100644 --- a/test/fixtures/offline_database/sideload_sat_multiple.db +++ b/test/fixtures/offline_database/sideload_sat_multiple.db diff --git a/test/fixtures/offline_database/v6.db b/test/fixtures/offline_database/v6.db Binary files differnew file mode 100644 index 0000000000..f19e639933 --- /dev/null +++ b/test/fixtures/offline_database/v6.db 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", |