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

Unified Diff: sync/syncable/directory.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, 12 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sync/syncable/directory.h ('k') | sync/syncable/directory_backing_store.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sync/syncable/directory.cc
diff --git a/sync/syncable/directory.cc b/sync/syncable/directory.cc
index c9b513215baae4a4a01e65072835f327fe35c3ea..3400c859952585f795e42865960a37d6ce97b1c6 100644
--- a/sync/syncable/directory.cc
+++ b/sync/syncable/directory.cc
@@ -10,6 +10,7 @@
#include "base/string_number_conversions.h"
#include "sync/internal_api/public/base/node_ordinal.h"
#include "sync/internal_api/public/util/unrecoverable_error_handler.h"
+#include "sync/syncable/delete_journal.h"
#include "sync/syncable/entry.h"
#include "sync/syncable/entry_kernel.h"
#include "sync/syncable/in_memory_directory_backing_store.h"
@@ -101,7 +102,10 @@ Directory::SaveChangesSnapshot::SaveChangesSnapshot()
: kernel_info_status(KERNEL_SHARE_INFO_INVALID) {
}
-Directory::SaveChangesSnapshot::~SaveChangesSnapshot() {}
+Directory::SaveChangesSnapshot::~SaveChangesSnapshot() {
+ STLDeleteElements(&dirty_metas);
+ STLDeleteElements(&delete_journals);
+}
Directory::Kernel::Kernel(
const std::string& name,
@@ -196,17 +200,19 @@ DirOpenResult Directory::OpenImpl(
DirectoryChangeDelegate* delegate,
const WeakHandle<TransactionObserver>&
transaction_observer) {
-
KernelLoadInfo info;
// Temporary indices before kernel_ initialized in case Load fails. We 0(1)
// swap these later.
MetahandlesIndex metas_bucket;
- DirOpenResult result = store_->Load(&metas_bucket, &info);
+ JournalIndex delete_journals;
+
+ DirOpenResult result = store_->Load(&metas_bucket, &delete_journals, &info);
if (OPENED != result)
return result;
kernel_ = new Kernel(name, info, delegate, transaction_observer);
kernel_->metahandles_index->swap(metas_bucket);
+ delete_journal_.reset(new DeleteJournal(&delete_journals));
InitializeIndices();
// Write back the share info to reserve some space in 'next_id'. This will
@@ -219,6 +225,11 @@ DirOpenResult Directory::OpenImpl(
return OPENED;
}
+DeleteJournal* Directory::delete_journal() {
+ DCHECK(delete_journal_.get());
+ return delete_journal_.get();
+}
+
void Directory::Close() {
store_.reset();
if (kernel_) {
@@ -236,7 +247,6 @@ void Directory::OnUnrecoverableError(const BaseTransaction* trans,
message);
}
-
EntryKernel* Directory::GetEntryById(const Id& id) {
ScopedKernelLock lock(this);
return GetEntryById(id, &lock);
@@ -466,7 +476,8 @@ void Directory::TakeSnapshotForSaveChanges(SaveChangesSnapshot* snapshot) {
// Skip over false positives; it happens relatively infrequently.
if (!entry->is_dirty())
continue;
- snapshot->dirty_metas.insert(snapshot->dirty_metas.end(), *entry);
+ snapshot->dirty_metas.insert(snapshot->dirty_metas.end(),
+ new EntryKernel(*entry));
DCHECK_EQ(1U, kernel_->dirty_metahandles->count(*i));
// We don't bother removing from the index here as we blow the entire thing
// in a moment, and it unnecessarily complicates iteration.
@@ -488,6 +499,9 @@ void Directory::TakeSnapshotForSaveChanges(SaveChangesSnapshot* snapshot) {
snapshot->kernel_info_status = kernel_->info_status;
// This one we reset on failure.
kernel_->info_status = KERNEL_SHARE_INFO_VALID;
+
+ delete_journal_->TakeSnapshotAndClear(
+ &trans, &snapshot->delete_journals, &snapshot->delete_journals_to_purge);
}
bool Directory::SaveChanges() {
@@ -518,7 +532,7 @@ bool Directory::VacuumAfterSaveChanges(const SaveChangesSnapshot& snapshot) {
// Now drop everything we can out of memory.
for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin();
i != snapshot.dirty_metas.end(); ++i) {
- kernel_->needle.put(META_HANDLE, i->ref(META_HANDLE));
+ kernel_->needle.put(META_HANDLE, (*i)->ref(META_HANDLE));
MetahandlesIndex::iterator found =
kernel_->metahandles_index->find(&kernel_->needle);
EntryKernel* entry = (found == kernel_->metahandles_index->end() ?
@@ -605,6 +619,7 @@ bool Directory::PurgeEntriesWithTypeIn(ModelTypeSet types) {
}
void Directory::HandleSaveChangesFailure(const SaveChangesSnapshot& snapshot) {
+ WriteTransaction trans(FROM_HERE, HANDLE_SAVE_FAILURE, this);
ScopedKernelLock lock(this);
kernel_->info_status = KERNEL_SHARE_INFO_DIRTY;
@@ -615,7 +630,7 @@ void Directory::HandleSaveChangesFailure(const SaveChangesSnapshot& snapshot) {
// that SaveChanges will at least try again later.
for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin();
i != snapshot.dirty_metas.end(); ++i) {
- kernel_->needle.put(META_HANDLE, i->ref(META_HANDLE));
+ kernel_->needle.put(META_HANDLE, (*i)->ref(META_HANDLE));
MetahandlesIndex::iterator found =
kernel_->metahandles_index->find(&kernel_->needle);
if (found != kernel_->metahandles_index->end()) {
@@ -625,6 +640,11 @@ void Directory::HandleSaveChangesFailure(const SaveChangesSnapshot& snapshot) {
kernel_->metahandles_to_purge->insert(snapshot.metahandles_to_purge.begin(),
snapshot.metahandles_to_purge.end());
+
+ // Restore delete journals.
+ delete_journal_->AddJournalBatch(&trans, snapshot.delete_journals);
+ delete_journal_->PurgeDeleteJournals(&trans,
+ snapshot.delete_journals_to_purge);
}
void Directory::GetDownloadProgress(
« no previous file with comments | « sync/syncable/directory.h ('k') | sync/syncable/directory_backing_store.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698