Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: sync/syncable/on_disk_directory_backing_store.cc

Issue 1008103002: Sync: Avoid 3 passes over SyncDarta DB when loading the directory from the disk (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed CR feedback. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "sync/syncable/on_disk_directory_backing_store.h" 5 #include "sync/syncable/on_disk_directory_backing_store.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "sync/syncable/syncable-inl.h" 10 #include "sync/syncable/syncable-inl.h"
(...skipping 19 matching lines...) Expand all
30 backing_filepath_(backing_filepath) { 30 backing_filepath_(backing_filepath) {
31 db_->set_exclusive_locking(); 31 db_->set_exclusive_locking();
32 db_->set_page_size(4096); 32 db_->set_page_size(4096);
33 } 33 }
34 34
35 OnDiskDirectoryBackingStore::~OnDiskDirectoryBackingStore() { } 35 OnDiskDirectoryBackingStore::~OnDiskDirectoryBackingStore() { }
36 36
37 DirOpenResult OnDiskDirectoryBackingStore::TryLoad( 37 DirOpenResult OnDiskDirectoryBackingStore::TryLoad(
38 Directory::MetahandlesMap* handles_map, 38 Directory::MetahandlesMap* handles_map,
39 JournalIndex* delete_journals, 39 JournalIndex* delete_journals,
40 MetahandleSet* metahandles_to_purge,
40 Directory::KernelLoadInfo* kernel_load_info) { 41 Directory::KernelLoadInfo* kernel_load_info) {
41 DCHECK(CalledOnValidThread()); 42 DCHECK(CalledOnValidThread());
42 if (!db_->is_open()) { 43 if (!db_->is_open()) {
43 if (!db_->Open(backing_filepath_)) 44 if (!db_->Open(backing_filepath_))
44 return FAILED_OPEN_DATABASE; 45 return FAILED_OPEN_DATABASE;
45 } 46 }
46 47
47 if (!InitializeTables()) 48 if (!InitializeTables())
48 return FAILED_OPEN_DATABASE; 49 return FAILED_OPEN_DATABASE;
49 50
50 if (!DropDeletedEntries()) 51 if (!LoadEntries(handles_map, metahandles_to_purge))
51 return FAILED_DATABASE_CORRUPT;
52 if (!LoadEntries(handles_map))
53 return FAILED_DATABASE_CORRUPT; 52 return FAILED_DATABASE_CORRUPT;
54 if (!LoadDeleteJournals(delete_journals)) 53 if (!LoadDeleteJournals(delete_journals))
55 return FAILED_DATABASE_CORRUPT; 54 return FAILED_DATABASE_CORRUPT;
56 if (!LoadInfo(kernel_load_info)) 55 if (!LoadInfo(kernel_load_info))
57 return FAILED_DATABASE_CORRUPT; 56 return FAILED_DATABASE_CORRUPT;
58 if (!VerifyReferenceIntegrity(handles_map)) 57 if (!VerifyReferenceIntegrity(handles_map))
59 return FAILED_DATABASE_CORRUPT; 58 return FAILED_DATABASE_CORRUPT;
60 59
61 return OPENED; 60 return OPENED;
62 61
63 } 62 }
64 63
65 DirOpenResult OnDiskDirectoryBackingStore::Load( 64 DirOpenResult OnDiskDirectoryBackingStore::Load(
66 Directory::MetahandlesMap* handles_map, 65 Directory::MetahandlesMap* handles_map,
67 JournalIndex* delete_journals, 66 JournalIndex* delete_journals,
67 MetahandleSet* metahandles_to_purge,
68 Directory::KernelLoadInfo* kernel_load_info) { 68 Directory::KernelLoadInfo* kernel_load_info) {
69 DirOpenResult result = TryLoad(handles_map, delete_journals, 69 DirOpenResult result = TryLoad(handles_map, delete_journals,
70 kernel_load_info); 70 metahandles_to_purge, kernel_load_info);
71 if (result == OPENED) { 71 if (result == OPENED) {
72 UMA_HISTOGRAM_ENUMERATION( 72 UMA_HISTOGRAM_ENUMERATION(
73 "Sync.DirectoryOpenResult", FIRST_TRY_SUCCESS, RESULT_COUNT); 73 "Sync.DirectoryOpenResult", FIRST_TRY_SUCCESS, RESULT_COUNT);
74 return OPENED; 74 return OPENED;
75 } 75 }
76 76
77 ReportFirstTryOpenFailure(); 77 ReportFirstTryOpenFailure();
78 78
79 // The fallback: delete the current database and return a fresh one. We can 79 // The fallback: delete the current database and return a fresh one. We can
80 // fetch the user's data from the cloud. 80 // fetch the user's data from the cloud.
81 STLDeleteValues(handles_map); 81 STLDeleteValues(handles_map);
82 STLDeleteElements(delete_journals); 82 STLDeleteElements(delete_journals);
83 db_.reset(new sql::Connection); 83 db_.reset(new sql::Connection);
84 // TODO: Manually propagating the default database settings is 84 // TODO: Manually propagating the default database settings is
85 // brittle. Either have a helper to set these up (or generate a new 85 // brittle. Either have a helper to set these up (or generate a new
86 // connection), or add something like Reset() to sql::Connection. 86 // connection), or add something like Reset() to sql::Connection.
87 db_->set_exclusive_locking(); 87 db_->set_exclusive_locking();
88 db_->set_page_size(4096); 88 db_->set_page_size(4096);
89 db_->set_histogram_tag("SyncDirectory"); 89 db_->set_histogram_tag("SyncDirectory");
90 base::DeleteFile(backing_filepath_, false); 90 base::DeleteFile(backing_filepath_, false);
91 91
92 result = TryLoad(handles_map, delete_journals, kernel_load_info); 92 result = TryLoad(handles_map, delete_journals, metahandles_to_purge,
93 kernel_load_info);
93 if (result == OPENED) { 94 if (result == OPENED) {
94 UMA_HISTOGRAM_ENUMERATION( 95 UMA_HISTOGRAM_ENUMERATION(
95 "Sync.DirectoryOpenResult", SECOND_TRY_SUCCESS, RESULT_COUNT); 96 "Sync.DirectoryOpenResult", SECOND_TRY_SUCCESS, RESULT_COUNT);
96 } else { 97 } else {
97 UMA_HISTOGRAM_ENUMERATION( 98 UMA_HISTOGRAM_ENUMERATION(
98 "Sync.DirectoryOpenResult", SECOND_TRY_FAILURE, RESULT_COUNT); 99 "Sync.DirectoryOpenResult", SECOND_TRY_FAILURE, RESULT_COUNT);
99 } 100 }
100 101
101 return result; 102 return result;
102 } 103 }
103 104
104 void OnDiskDirectoryBackingStore::ReportFirstTryOpenFailure() { 105 void OnDiskDirectoryBackingStore::ReportFirstTryOpenFailure() {
105 // In debug builds, the last thing we want is to silently clear the database. 106 // In debug builds, the last thing we want is to silently clear the database.
106 // It's full of evidence that might help us determine what went wrong. It 107 // It's full of evidence that might help us determine what went wrong. It
107 // might be sqlite's fault, but it could also be a bug in sync. We crash 108 // might be sqlite's fault, but it could also be a bug in sync. We crash
108 // immediately so a developer can investigate. 109 // immediately so a developer can investigate.
109 // 110 //
110 // Developers: If you're not interested in debugging this right now, just move 111 // Developers: If you're not interested in debugging this right now, just move
111 // aside the 'Sync Data' directory in your profile. This is similar to what 112 // aside the 'Sync Data' directory in your profile. This is similar to what
112 // the code would do if this DCHECK were disabled. 113 // the code would do if this DCHECK were disabled.
113 NOTREACHED() << "Crashing to preserve corrupt sync database"; 114 NOTREACHED() << "Crashing to preserve corrupt sync database";
114 } 115 }
115 116
116 } // namespace syncable 117 } // namespace syncable
117 } // namespace syncer 118 } // namespace syncer
OLDNEW
« no previous file with comments | « sync/syncable/on_disk_directory_backing_store.h ('k') | sync/test/test_directory_backing_store.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698