 Chromium Code Reviews
 Chromium Code Reviews Issue 1016563005:
  Increase page size for SyncData DB from 4K to maximum supported 32K  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 1016563005:
  Increase page size for SyncData DB from 4K to maximum supported 32K  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| Index: sync/syncable/directory_backing_store.cc | 
| diff --git a/sync/syncable/directory_backing_store.cc b/sync/syncable/directory_backing_store.cc | 
| index f87933bea6323bfa9612ed6f2c031141985f2e66..6dad4856d61b6ce9e25913bc13213bbcbc9c59b8 100644 | 
| --- a/sync/syncable/directory_backing_store.cc | 
| +++ b/sync/syncable/directory_backing_store.cc | 
| @@ -10,6 +10,7 @@ | 
| #include "base/base64.h" | 
| #include "base/logging.h" | 
| +#include "base/metrics/field_trial.h" | 
| #include "base/rand_util.h" | 
| #include "base/strings/stringprintf.h" | 
| #include "base/time/time.h" | 
| @@ -175,8 +176,13 @@ DirectoryBackingStore::DirectoryBackingStore(const string& dir_name) | 
| dir_name_(dir_name), | 
| needs_column_refresh_(false) { | 
| db_->set_histogram_tag("SyncDirectory"); | 
| - db_->set_page_size(4096); | 
| db_->set_cache_size(32); | 
| + if (IsSyncBackingDatabase32KEnabled()) { | 
| 
stanisc
2015/03/18 15:10:45
Consider ternary "? :" operator here instead of "i
 
Gang Wu
2015/05/21 18:38:17
Done.
 | 
| + databasePageSize = 32768; | 
| + } else { | 
| + databasePageSize = 4096; | 
| + } | 
| + db_->set_page_size(databasePageSize); | 
| } | 
| DirectoryBackingStore::DirectoryBackingStore(const string& dir_name, | 
| @@ -308,6 +314,12 @@ bool DirectoryBackingStore::SaveChanges( | 
| } | 
| bool DirectoryBackingStore::InitializeTables() { | 
| + int page_size = 0; | 
| + if (IsSyncBackingDatabase32KEnabled() && | 
| + GetDatabasePageSize(&page_size) && | 
| + page_size == 4096) { | 
| + IncreasePageSizeTo32K(); | 
| + } | 
| sql::Transaction transaction(db_.get()); | 
| if (!transaction.Begin()) | 
| return false; | 
| @@ -1593,5 +1605,36 @@ void DirectoryBackingStore::PrepareSaveEntryStatement( | 
| base::StringPrintf(query.c_str(), "metas").c_str())); | 
| } | 
| +// Get page size for the database. | 
| +bool DirectoryBackingStore::GetDatabasePageSize(int* page_size) { | 
| + sql::Statement s(db_->GetUniqueStatement("PRAGMA page_size")); | 
| + if (!s.Step()) | 
| + return false; | 
| + *page_size = s.ColumnInt(0); | 
| + return true; | 
| +} | 
| + | 
| +bool DirectoryBackingStore::IsSyncBackingDatabase32KEnabled() { | 
| + const std::string group_name = | 
| + base::FieldTrialList::FindFullName("SyncBackingDatabase32K"); | 
| + return group_name == "Enabled"; | 
| +} | 
| + | 
| +bool DirectoryBackingStore::IncreasePageSizeTo32K() { | 
| + if (!db_->Execute("PRAGMA page_size=32768;") || | 
| + !Vacuum()) { | 
| + return false; | 
| + } | 
| + return true; | 
| +} | 
| + | 
| +bool DirectoryBackingStore::Vacuum() { | 
| + DCHECK_EQ(db_->transaction_nesting(), 0); | 
| + if (!db_->Execute("VACUUM;")) { | 
| + return false; | 
| + } | 
| + return true; | 
| +} | 
| + | 
| } // namespace syncable | 
| } // namespace syncer |