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

Side by Side Diff: components/sync/syncable/directory.cc

Issue 2563883006: [Sync] Separate purge types step from sync manager configuration. (Closed)
Patch Set: Created 4 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
« no previous file with comments | « components/sync/syncable/directory.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "components/sync/syncable/directory.h" 5 #include "components/sync/syncable/directory.h"
6 6
7 #include <inttypes.h> 7 #include <inttypes.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <iterator> 10 #include <iterator>
(...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 num_erased = kernel_->server_tags_map.erase(entry->ref(UNIQUE_SERVER_TAG)); 722 num_erased = kernel_->server_tags_map.erase(entry->ref(UNIQUE_SERVER_TAG));
723 DCHECK_EQ(1u, num_erased); 723 DCHECK_EQ(1u, num_erased);
724 } 724 }
725 RemoveFromAttachmentIndex(lock, handle, entry->ref(ATTACHMENT_METADATA)); 725 RemoveFromAttachmentIndex(lock, handle, entry->ref(ATTACHMENT_METADATA));
726 726
727 if (save_to_journal) { 727 if (save_to_journal) {
728 entries_to_journal->insert(std::move(entry_ptr)); 728 entries_to_journal->insert(std::move(entry_ptr));
729 } 729 }
730 } 730 }
731 731
732 bool Directory::PurgeEntriesWithTypeIn(ModelTypeSet disabled_types, 732 void Directory::PurgeEntriesWithTypeIn(ModelTypeSet disabled_types,
733 ModelTypeSet types_to_journal, 733 ModelTypeSet types_to_journal,
734 ModelTypeSet types_to_unapply) { 734 ModelTypeSet types_to_unapply) {
735 disabled_types.RemoveAll(ProxyTypes()); 735 disabled_types.RemoveAll(ProxyTypes());
736 if (disabled_types.Empty())
737 return;
736 738
737 if (disabled_types.Empty()) 739 WriteTransaction trans(FROM_HERE, PURGE_ENTRIES, this);
738 return true; 740
741 OwnedEntryKernelSet entries_to_journal;
739 742
740 { 743 {
741 WriteTransaction trans(FROM_HERE, PURGE_ENTRIES, this); 744 ScopedKernelLock lock(this);
742 745
743 OwnedEntryKernelSet entries_to_journal; 746 bool found_progress = false;
747 for (ModelTypeSet::Iterator iter = disabled_types.First(); iter.Good();
748 iter.Inc()) {
749 if (!kernel_->persisted_info.HasEmptyDownloadProgress(iter.Get()))
750 found_progress = true;
751 }
744 752
745 { 753 // If none of the disabled types have progress markers, there's nothing to
746 ScopedKernelLock lock(this); 754 // purge.
755 if (!found_progress)
756 return;
747 757
748 bool found_progress = false; 758 for (MetahandlesMap::iterator it = kernel_->metahandles_map.begin();
749 for (ModelTypeSet::Iterator iter = disabled_types.First(); iter.Good(); 759 it != kernel_->metahandles_map.end();) {
750 iter.Inc()) { 760 EntryKernel* entry = it->second.get();
751 if (!kernel_->persisted_info.HasEmptyDownloadProgress(iter.Get())) 761 const sync_pb::EntitySpecifics& local_specifics = entry->ref(SPECIFICS);
752 found_progress = true; 762 const sync_pb::EntitySpecifics& server_specifics =
753 } 763 entry->ref(SERVER_SPECIFICS);
764 ModelType local_type = GetModelTypeFromSpecifics(local_specifics);
765 ModelType server_type = GetModelTypeFromSpecifics(server_specifics);
754 766
755 // If none of the disabled types have progress markers, there's nothing to 767 // Increment the iterator before (potentially) calling DeleteEntry,
756 // purge. 768 // otherwise our iterator may be invalidated.
757 if (!found_progress) 769 ++it;
758 return true;
759 770
760 for (MetahandlesMap::iterator it = kernel_->metahandles_map.begin(); 771 if ((IsRealDataType(local_type) && disabled_types.Has(local_type)) ||
761 it != kernel_->metahandles_map.end();) { 772 (IsRealDataType(server_type) && disabled_types.Has(server_type))) {
762 EntryKernel* entry = it->second.get(); 773 if (types_to_unapply.Has(local_type) ||
763 const sync_pb::EntitySpecifics& local_specifics = entry->ref(SPECIFICS); 774 types_to_unapply.Has(server_type)) {
764 const sync_pb::EntitySpecifics& server_specifics = 775 UnapplyEntry(entry);
765 entry->ref(SERVER_SPECIFICS); 776 } else {
766 ModelType local_type = GetModelTypeFromSpecifics(local_specifics); 777 bool save_to_journal =
767 ModelType server_type = GetModelTypeFromSpecifics(server_specifics); 778 (types_to_journal.Has(local_type) ||
768 779 types_to_journal.Has(server_type)) &&
769 // Increment the iterator before (potentially) calling DeleteEntry, 780 (delete_journal_->IsDeleteJournalEnabled(local_type) ||
770 // otherwise our iterator may be invalidated. 781 delete_journal_->IsDeleteJournalEnabled(server_type));
771 ++it; 782 DeleteEntry(lock, save_to_journal, entry, &entries_to_journal);
772
773 if ((IsRealDataType(local_type) && disabled_types.Has(local_type)) ||
774 (IsRealDataType(server_type) && disabled_types.Has(server_type))) {
775 if (types_to_unapply.Has(local_type) ||
776 types_to_unapply.Has(server_type)) {
777 UnapplyEntry(entry);
778 } else {
779 bool save_to_journal =
780 (types_to_journal.Has(local_type) ||
781 types_to_journal.Has(server_type)) &&
782 (delete_journal_->IsDeleteJournalEnabled(local_type) ||
783 delete_journal_->IsDeleteJournalEnabled(server_type));
784 DeleteEntry(lock, save_to_journal, entry, &entries_to_journal);
785 }
786 } 783 }
787 } 784 }
785 }
788 786
789 delete_journal_->AddJournalBatch(&trans, entries_to_journal); 787 delete_journal_->AddJournalBatch(&trans, entries_to_journal);
790 788
791 // Ensure meta tracking for these data types reflects the purged state. 789 // Ensure meta tracking for these data types reflects the purged state.
792 for (ModelTypeSet::Iterator it = disabled_types.First(); it.Good(); 790 for (ModelTypeSet::Iterator it = disabled_types.First(); it.Good();
793 it.Inc()) { 791 it.Inc()) {
794 kernel_->persisted_info.transaction_version[it.Get()] = 0; 792 kernel_->persisted_info.transaction_version[it.Get()] = 0;
795 793
796 // Don't discard progress markers or context for unapplied types. 794 // Don't discard progress markers or context for unapplied types.
797 if (!types_to_unapply.Has(it.Get())) { 795 if (!types_to_unapply.Has(it.Get())) {
798 kernel_->persisted_info.ResetDownloadProgress(it.Get()); 796 kernel_->persisted_info.ResetDownloadProgress(it.Get());
799 kernel_->persisted_info.datatype_context[it.Get()].Clear(); 797 kernel_->persisted_info.datatype_context[it.Get()].Clear();
800 }
801 } 798 }
799 }
802 800
803 kernel_->info_status = KERNEL_SHARE_INFO_DIRTY; 801 kernel_->info_status = KERNEL_SHARE_INFO_DIRTY;
804 }
805 } 802 }
806 return true;
807 } 803 }
808 804
809 bool Directory::ResetVersionsForType(BaseWriteTransaction* trans, 805 bool Directory::ResetVersionsForType(BaseWriteTransaction* trans,
810 ModelType type) { 806 ModelType type) {
811 if (!ProtocolTypes().Has(type)) 807 if (!ProtocolTypes().Has(type))
812 return false; 808 return false;
813 DCHECK_NE(type, BOOKMARKS) << "Only non-hierarchical types are supported"; 809 DCHECK_NE(type, BOOKMARKS) << "Only non-hierarchical types are supported";
814 810
815 EntryKernel* type_root = GetEntryByServerTag(ModelTypeToRootTag(type)); 811 EntryKernel* type_root = GetEntryByServerTag(ModelTypeToRootTag(type));
816 if (!type_root) 812 if (!type_root)
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after
1592 Directory::Kernel* Directory::kernel() { 1588 Directory::Kernel* Directory::kernel() {
1593 return kernel_; 1589 return kernel_;
1594 } 1590 }
1595 1591
1596 const Directory::Kernel* Directory::kernel() const { 1592 const Directory::Kernel* Directory::kernel() const {
1597 return kernel_; 1593 return kernel_;
1598 } 1594 }
1599 1595
1600 } // namespace syncable 1596 } // namespace syncable
1601 } // namespace syncer 1597 } // namespace syncer
OLDNEW
« no previous file with comments | « components/sync/syncable/directory.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698