From b906792ad71eaa140015eb120f318fecd57507b6 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Tue, 22 Oct 2019 11:20:11 +0300 Subject: [core] Version 7 for offline database The newly introduced version puts in place `auto_vacuum = INCREMENTAL` and provides migration from the older versions. --- .../include/mbgl/storage/offline_database.hpp | 1 + .../default/src/mbgl/storage/offline_database.cpp | 15 ++++- test/fixtures/offline_database/corrupt-delayed.db | Bin 19456 -> 19456 bytes test/fixtures/offline_database/offline_sideload.db | Bin 73728 -> 73728 bytes test/fixtures/offline_database/satellite_test.db | Bin 114688 -> 114688 bytes test/fixtures/offline_database/sideload_ambient.db | Bin 90112 -> 90112 bytes test/fixtures/offline_database/sideload_sat.db | Bin 73728 -> 73728 bytes .../offline_database/sideload_sat_multiple.db | Bin 90112 -> 90112 bytes test/fixtures/offline_database/v6.db | Bin 0 -> 61440 bytes test/storage/offline_database.test.cpp | 62 +++++++++++++++++++-- 10 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 test/fixtures/offline_database/v6.db 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("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 Binary files a/test/fixtures/offline_database/corrupt-delayed.db and b/test/fixtures/offline_database/corrupt-delayed.db differ diff --git a/test/fixtures/offline_database/offline_sideload.db b/test/fixtures/offline_database/offline_sideload.db index 6146e30872..6d1528a333 100644 Binary files a/test/fixtures/offline_database/offline_sideload.db and b/test/fixtures/offline_database/offline_sideload.db differ diff --git a/test/fixtures/offline_database/satellite_test.db b/test/fixtures/offline_database/satellite_test.db index 95dd8617ff..023cabcffc 100644 Binary files a/test/fixtures/offline_database/satellite_test.db and b/test/fixtures/offline_database/satellite_test.db differ diff --git a/test/fixtures/offline_database/sideload_ambient.db b/test/fixtures/offline_database/sideload_ambient.db index 5f10a23c61..9c9f7a8041 100644 Binary files a/test/fixtures/offline_database/sideload_ambient.db and b/test/fixtures/offline_database/sideload_ambient.db differ diff --git a/test/fixtures/offline_database/sideload_sat.db b/test/fixtures/offline_database/sideload_sat.db index 6146e30872..6d1528a333 100644 Binary files a/test/fixtures/offline_database/sideload_sat.db and b/test/fixtures/offline_database/sideload_sat.db 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 Binary files a/test/fixtures/offline_database/sideload_sat_multiple.db and b/test/fixtures/offline_database/sideload_sat_multiple.db differ diff --git a/test/fixtures/offline_database/v6.db b/test/fixtures/offline_database/v6.db new file mode 100644 index 0000000000..f19e639933 Binary files /dev/null and b/test/fixtures/offline_database/v6.db 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 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(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{"id", + "url_template", + "pixel_ratio", + "z", + "x", + "y", + "expires", + "modified", + "etag", + "data", + "compressed", + "accessed", + "must_revalidate"}), + databaseTableColumns(filename, "tiles")); + EXPECT_EQ( + (std::vector{ + "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{ "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{ "id", "url_template", "pixel_ratio", "z", "x", "y", "expires", "modified", "etag", "data", "compressed", -- cgit v1.2.1