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

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

Issue 11441026: [Sync] Add support for loading, updating and querying delete journals in (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: make IsDeleteJournalEnabled() public Created 8 years 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 | Annotate | Revision Log
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "sync/syncable/delete_journal.h"
6
7 #include "base/stl_util.h"
8 #include "sync/internal_api/public/base/model_type.h"
9
10 namespace syncer {
11 namespace syncable {
12
13 DeleteJournal::DeleteJournal(JournalIndex& initial_journal) {
14 delete_journals_.swap(initial_journal);
15 }
16
17 DeleteJournal::~DeleteJournal() {
18 STLDeleteElements(&delete_journals_);
19 }
20
21 size_t DeleteJournal::GetDeleteJournalSize() const {
22 return delete_journals_.size();
23 }
24
25 void DeleteJournal::UpdateDeleteJournalForServerDelete(
26 BaseTransaction* trans, bool was_deleted, const EntryKernel& entry) {
27 // Should be sufficient to check server type only but check for local
tim (not reviewing) 2012/12/21 03:30:40 Could you add a unittest covering some of the logi
haitaol1 2013/01/03 19:40:49 Tests are in syncable_unittest.cc On 2012/12/21 0
28 // type too because of incomplete test setup.
29 if (!(IsDeleteJournalEnabled(entry.GetServerModelType()) ||
30 IsDeleteJournalEnabled(
31 GetModelTypeFromSpecifics(entry.ref(SPECIFICS))))) {
32 return;
33 }
34
35 base::AutoLock lock(journal_lock_);
36 JournalIndex::const_iterator it = delete_journals_.find(&entry);
37
38 if (entry.ref(SERVER_IS_DEL)) {
39 if (it == delete_journals_.end()) {
40 // New delete.
41 EntryKernel* t = new EntryKernel(entry);
42 delete_journals_.insert(t);
43 delete_journals_to_purge_.erase(t->ref(META_HANDLE));
44 }
45 } else {
46 // Undelete. This could happen in two cases:
47 // * An entry was deleted then undeleted, i.e. server delete was
48 // overwritten because of entry has unsynced data locally.
49 // * A data type was broken, i.e. encountered unrecoverable error, in last
50 // sync session and all its entries were duplicated in delete journals.
51 // On restart, entries are recreated from downloads and recreation calls
52 // UpdateDeleteJournals() to remove live entries from delete journals,
53 // thus only deleted entries remain in journals.
54 if (it != delete_journals_.end()) {
55 delete_journals_to_purge_.insert((*it)->ref(META_HANDLE));
56 delete *it;
57 delete_journals_.erase(it);
58 } else if (was_deleted) {
59 delete_journals_to_purge_.insert(entry.ref(META_HANDLE));
60 }
61 }
62 }
63
64 void DeleteJournal::GetDeleteJournals(BaseTransaction* trans,
65 ModelType type,
66 EntryKernelSet* deleted_entries) {
67 base::AutoLock lock(journal_lock_);
68 DCHECK(!passive_delete_journal_types_.Has(type));
69 for (JournalIndex::const_iterator it = delete_journals_.begin();
70 it != delete_journals_.end(); ++it) {
71 if ((*it)->GetServerModelType() == type ||
72 GetModelTypeFromSpecifics((*it)->ref(SPECIFICS)) == type) {
73 deleted_entries->insert(*it);
74 }
75 }
76 passive_delete_journal_types_.Put(type);
77 }
78
79 void DeleteJournal::PurgeDeleteJournals(BaseTransaction* trans,
80 const MetahandleSet& to_purge) {
81 base::AutoLock lock(journal_lock_);
82 JournalIndex::const_iterator it = delete_journals_.begin();
83 while (it != delete_journals_.end()) {
84 int64 handle = (*it)->ref(META_HANDLE);
85 if (to_purge.count(handle)) {
86 delete *it;
87 delete_journals_.erase(it++);
88 } else {
89 ++it;
90 }
91 }
92 delete_journals_to_purge_.insert(to_purge.begin(), to_purge.end());
93 }
94
95 void DeleteJournal::TakeSnapshotAndClear(EntryKernelSet* journal_entries,
96 MetahandleSet* journals_to_purge) {
97 base::AutoLock lock(journal_lock_);
98
99 // Move passive delete journals to snapshot. Will copy back if snapshot fails
100 // to save.
101 JournalIndex::const_iterator it = delete_journals_.begin();
102 while (it != delete_journals_.end()) {
103 if (passive_delete_journal_types_.Has((*it)->GetServerModelType()) ||
104 passive_delete_journal_types_.Has(GetModelTypeFromSpecifics(
105 (*it)->ref(SPECIFICS)))) {
106 journal_entries->insert(*it);
107 delete_journals_.erase(it++);
108 } else {
109 ++it;
110 }
111 }
112 *journals_to_purge = delete_journals_to_purge_;
113 delete_journals_to_purge_.clear();
114 }
115
116 void DeleteJournal::AddJournals(BaseTransaction* trans,
117 const EntryKernelSet& entries) {
118 base::AutoLock lock(journal_lock_);
119 EntryKernel needle;
120 for (EntryKernelSet::const_iterator i = entries.begin();
121 i != entries.end(); ++i) {
122 needle.put(ID, (*i)->ref(ID));
123 if (delete_journals_.find(&needle) == delete_journals_.end()) {
124 delete_journals_.insert(new EntryKernel(**i));
125 }
126 delete_journals_to_purge_.erase((*i)->ref(META_HANDLE));
127 }
128 }
129
130 /* static */
131 bool DeleteJournal::IsDeleteJournalEnabled(ModelType type) {
132 switch (type) {
133 case BOOKMARKS:
134 return true;
135 default:
136 return false;
137 }
138 }
139
140 } // namespace syncable
141 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698