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

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: Created 7 years, 11 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 | 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 CHECK(initial_journal);
15 delete_journals_.swap(*initial_journal);
16 }
17
18 DeleteJournal::~DeleteJournal() {
19 STLDeleteElements(&delete_journals_);
20 }
21
22 size_t DeleteJournal::GetDeleteJournalSize(BaseTransaction* trans) const {
23 return delete_journals_.size();
24 }
25
26 void DeleteJournal::UpdateDeleteJournalForServerDelete(
27 BaseTransaction* trans, bool was_deleted, const EntryKernel& entry) {
28 // Should be sufficient to check server type only but check for local
29 // type too because of incomplete test setup.
30 if (!(IsDeleteJournalEnabled(entry.GetServerModelType()) ||
31 IsDeleteJournalEnabled(
32 GetModelTypeFromSpecifics(entry.ref(SPECIFICS))))) {
33 return;
34 }
35
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 DCHECK(!passive_delete_journal_types_.Has(type));
68 for (JournalIndex::const_iterator it = delete_journals_.begin();
69 it != delete_journals_.end(); ++it) {
70 if ((*it)->GetServerModelType() == type ||
71 GetModelTypeFromSpecifics((*it)->ref(SPECIFICS)) == type) {
72 deleted_entries->insert(*it);
73 }
74 }
75 passive_delete_journal_types_.Put(type);
76 }
77
78 void DeleteJournal::PurgeDeleteJournals(BaseTransaction* trans,
79 const MetahandleSet& to_purge) {
80 JournalIndex::const_iterator it = delete_journals_.begin();
81 while (it != delete_journals_.end()) {
82 int64 handle = (*it)->ref(META_HANDLE);
83 if (to_purge.count(handle)) {
84 delete *it;
85 delete_journals_.erase(it++);
86 } else {
87 ++it;
88 }
89 }
90 delete_journals_to_purge_.insert(to_purge.begin(), to_purge.end());
91 }
92
93 void DeleteJournal::TakeSnapshotAndClear(BaseTransaction* trans,
94 EntryKernelSet* journal_entries,
95 MetahandleSet* journals_to_purge) {
96 // Move passive delete journals to snapshot. Will copy back if snapshot fails
97 // to save.
98 JournalIndex::const_iterator it = delete_journals_.begin();
99 while (it != delete_journals_.end()) {
100 if (passive_delete_journal_types_.Has((*it)->GetServerModelType()) ||
101 passive_delete_journal_types_.Has(GetModelTypeFromSpecifics(
102 (*it)->ref(SPECIFICS)))) {
103 journal_entries->insert(*it);
104 delete_journals_.erase(it++);
105 } else {
106 ++it;
107 }
108 }
109 *journals_to_purge = delete_journals_to_purge_;
110 delete_journals_to_purge_.clear();
111 }
112
113 void DeleteJournal::AddJournalBatch(BaseTransaction* trans,
tim (not reviewing) 2013/01/04 18:54:14 Add DCHECK(trans) in these methods that don't expl
haitaol1 2013/01/04 19:06:14 Done.
114 const EntryKernelSet& entries) {
115 EntryKernel needle;
116 for (EntryKernelSet::const_iterator i = entries.begin();
117 i != entries.end(); ++i) {
118 needle.put(ID, (*i)->ref(ID));
119 if (delete_journals_.find(&needle) == delete_journals_.end()) {
120 delete_journals_.insert(new EntryKernel(**i));
121 }
122 delete_journals_to_purge_.erase((*i)->ref(META_HANDLE));
123 }
124 }
125
126 /* static */
127 bool DeleteJournal::IsDeleteJournalEnabled(ModelType type) {
128 switch (type) {
129 case BOOKMARKS:
130 return true;
131 default:
132 return false;
133 }
134 }
135
136 } // namespace syncable
137 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698