OLD | NEW |
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 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 | 347 |
348 int Directory::GetPositionIndex(BaseTransaction* trans, | 348 int Directory::GetPositionIndex(BaseTransaction* trans, |
349 EntryKernel* kernel) const { | 349 EntryKernel* kernel) const { |
350 const OrderedChildSet* siblings = | 350 const OrderedChildSet* siblings = |
351 kernel_->parent_child_index.GetSiblings(kernel); | 351 kernel_->parent_child_index.GetSiblings(kernel); |
352 | 352 |
353 OrderedChildSet::const_iterator it = siblings->find(kernel); | 353 OrderedChildSet::const_iterator it = siblings->find(kernel); |
354 return std::distance(siblings->begin(), it); | 354 return std::distance(siblings->begin(), it); |
355 } | 355 } |
356 | 356 |
357 bool Directory::InsertEntry(BaseWriteTransaction* trans, EntryKernel* entry) { | 357 bool Directory::InsertEntry(BaseWriteTransaction* trans, |
| 358 std::unique_ptr<EntryKernel> entry) { |
358 ScopedKernelLock lock(this); | 359 ScopedKernelLock lock(this); |
359 return InsertEntry(lock, trans, entry); | 360 return InsertEntry(lock, trans, std::move(entry)); |
360 } | 361 } |
361 | 362 |
362 bool Directory::InsertEntry(const ScopedKernelLock& lock, | 363 bool Directory::InsertEntry(const ScopedKernelLock& lock, |
363 BaseWriteTransaction* trans, | 364 BaseWriteTransaction* trans, |
364 EntryKernel* entry) { | 365 std::unique_ptr<EntryKernel> entry) { |
365 if (!SyncAssert(nullptr != entry, FROM_HERE, "Entry is null", trans)) | 366 if (!SyncAssert(nullptr != entry, FROM_HERE, "Entry is null", trans)) |
366 return false; | 367 return false; |
| 368 EntryKernel* entry_ptr = entry.get(); |
367 | 369 |
368 static const char error[] = "Entry already in memory index."; | 370 static const char error[] = "Entry already in memory index."; |
369 | 371 |
370 if (!SyncAssert(kernel_->metahandles_map | 372 if (!SyncAssert(kernel_->metahandles_map |
371 .insert(std::make_pair(entry->ref(META_HANDLE), | 373 .insert(std::make_pair(entry_ptr->ref(META_HANDLE), |
372 base::WrapUnique(entry))) | 374 std::move(entry))) |
373 .second, | 375 .second, |
374 FROM_HERE, error, trans)) { | 376 FROM_HERE, error, trans)) { |
375 return false; | 377 return false; |
376 } | 378 } |
377 if (!SyncAssert( | 379 if (!SyncAssert( |
378 kernel_->ids_map.insert(std::make_pair(entry->ref(ID).value(), entry)) | 380 kernel_->ids_map |
| 381 .insert(std::make_pair(entry_ptr->ref(ID).value(), entry_ptr)) |
379 .second, | 382 .second, |
380 FROM_HERE, error, trans)) { | 383 FROM_HERE, error, trans)) { |
381 return false; | 384 return false; |
382 } | 385 } |
383 if (ParentChildIndex::ShouldInclude(entry)) { | 386 if (ParentChildIndex::ShouldInclude(entry_ptr)) { |
384 if (!SyncAssert(kernel_->parent_child_index.Insert(entry), FROM_HERE, error, | 387 if (!SyncAssert(kernel_->parent_child_index.Insert(entry_ptr), FROM_HERE, |
385 trans)) { | 388 error, trans)) { |
386 return false; | 389 return false; |
387 } | 390 } |
388 } | 391 } |
389 AddToAttachmentIndex(lock, entry->ref(META_HANDLE), | 392 AddToAttachmentIndex(lock, entry_ptr->ref(META_HANDLE), |
390 entry->ref(ATTACHMENT_METADATA)); | 393 entry_ptr->ref(ATTACHMENT_METADATA)); |
391 | 394 |
392 // Should NEVER be created with a client tag or server tag. | 395 // Should NEVER be created with a client tag or server tag. |
393 if (!SyncAssert(entry->ref(UNIQUE_SERVER_TAG).empty(), FROM_HERE, | 396 if (!SyncAssert(entry_ptr->ref(UNIQUE_SERVER_TAG).empty(), FROM_HERE, |
394 "Server tag should be empty", trans)) { | 397 "Server tag should be empty", trans)) { |
395 return false; | 398 return false; |
396 } | 399 } |
397 if (!SyncAssert(entry->ref(UNIQUE_CLIENT_TAG).empty(), FROM_HERE, | 400 if (!SyncAssert(entry_ptr->ref(UNIQUE_CLIENT_TAG).empty(), FROM_HERE, |
398 "Client tag should be empty", trans)) | 401 "Client tag should be empty", trans)) |
399 return false; | 402 return false; |
400 | 403 |
401 return true; | 404 return true; |
402 } | 405 } |
403 | 406 |
404 bool Directory::ReindexId(BaseWriteTransaction* trans, | 407 bool Directory::ReindexId(BaseWriteTransaction* trans, |
405 EntryKernel* const entry, | 408 EntryKernel* const entry, |
406 const Id& new_id) { | 409 const Id& new_id) { |
407 ScopedKernelLock lock(this); | 410 ScopedKernelLock lock(this); |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 return true; | 613 return true; |
611 | 614 |
612 // Need a write transaction as we are about to permanently purge entries. | 615 // Need a write transaction as we are about to permanently purge entries. |
613 WriteTransaction trans(FROM_HERE, VACUUM_AFTER_SAVE, this); | 616 WriteTransaction trans(FROM_HERE, VACUUM_AFTER_SAVE, this); |
614 ScopedKernelLock lock(this); | 617 ScopedKernelLock lock(this); |
615 // Now drop everything we can out of memory. | 618 // Now drop everything we can out of memory. |
616 for (auto i = snapshot.dirty_metas.begin(); i != snapshot.dirty_metas.end(); | 619 for (auto i = snapshot.dirty_metas.begin(); i != snapshot.dirty_metas.end(); |
617 ++i) { | 620 ++i) { |
618 MetahandlesMap::iterator found = | 621 MetahandlesMap::iterator found = |
619 kernel_->metahandles_map.find((*i)->ref(META_HANDLE)); | 622 kernel_->metahandles_map.find((*i)->ref(META_HANDLE)); |
620 EntryKernel* entry = | 623 if (found != kernel_->metahandles_map.end() && |
621 (found == kernel_->metahandles_map.end() ? nullptr | 624 SafeToPurgeFromMemory(&trans, found->second.get())) { |
622 : found->second.get()); | |
623 if (entry && SafeToPurgeFromMemory(&trans, entry)) { | |
624 // We now drop deleted metahandles that are up to date on both the client | 625 // We now drop deleted metahandles that are up to date on both the client |
625 // and the server. | 626 // and the server. |
626 std::unique_ptr<EntryKernel> unique_entry = std::move(found->second); | 627 std::unique_ptr<EntryKernel> entry = std::move(found->second); |
627 | 628 |
628 size_t num_erased = 0; | 629 size_t num_erased = 0; |
629 num_erased = kernel_->metahandles_map.erase(entry->ref(META_HANDLE)); | 630 kernel_->metahandles_map.erase(found); |
630 DCHECK_EQ(1u, num_erased); | |
631 num_erased = kernel_->ids_map.erase(entry->ref(ID).value()); | 631 num_erased = kernel_->ids_map.erase(entry->ref(ID).value()); |
632 DCHECK_EQ(1u, num_erased); | 632 DCHECK_EQ(1u, num_erased); |
633 if (!entry->ref(UNIQUE_SERVER_TAG).empty()) { | 633 if (!entry->ref(UNIQUE_SERVER_TAG).empty()) { |
634 num_erased = | 634 num_erased = |
635 kernel_->server_tags_map.erase(entry->ref(UNIQUE_SERVER_TAG)); | 635 kernel_->server_tags_map.erase(entry->ref(UNIQUE_SERVER_TAG)); |
636 DCHECK_EQ(1u, num_erased); | 636 DCHECK_EQ(1u, num_erased); |
637 } | 637 } |
638 if (!entry->ref(UNIQUE_CLIENT_TAG).empty()) { | 638 if (!entry->ref(UNIQUE_CLIENT_TAG).empty()) { |
639 num_erased = | 639 num_erased = |
640 kernel_->client_tags_map.erase(entry->ref(UNIQUE_CLIENT_TAG)); | 640 kernel_->client_tags_map.erase(entry->ref(UNIQUE_CLIENT_TAG)); |
641 DCHECK_EQ(1u, num_erased); | 641 DCHECK_EQ(1u, num_erased); |
642 } | 642 } |
643 if (!SyncAssert(!kernel_->parent_child_index.Contains(entry), FROM_HERE, | 643 if (!SyncAssert(!kernel_->parent_child_index.Contains(entry.get()), |
644 "Deleted entry still present", (&trans))) | 644 FROM_HERE, "Deleted entry still present", (&trans))) |
645 return false; | 645 return false; |
646 RemoveFromAttachmentIndex(lock, entry->ref(META_HANDLE), | 646 RemoveFromAttachmentIndex(lock, entry->ref(META_HANDLE), |
647 entry->ref(ATTACHMENT_METADATA)); | 647 entry->ref(ATTACHMENT_METADATA)); |
648 } | 648 } |
649 if (trans.unrecoverable_error_set()) | 649 if (trans.unrecoverable_error_set()) |
650 return false; | 650 return false; |
651 } | 651 } |
652 return true; | 652 return true; |
653 } | 653 } |
654 | 654 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
703 } | 703 } |
704 | 704 |
705 // At this point locally created items that aren't synced will become locally | 705 // At this point locally created items that aren't synced will become locally |
706 // deleted items, and purged on the next snapshot. All other items will match | 706 // deleted items, and purged on the next snapshot. All other items will match |
707 // the state they would have had if they were just created via a server | 707 // the state they would have had if they were just created via a server |
708 // update. See MutableEntry::MutableEntry(.., CreateNewUpdateItem, ..). | 708 // update. See MutableEntry::MutableEntry(.., CreateNewUpdateItem, ..). |
709 } | 709 } |
710 | 710 |
711 void Directory::DeleteEntry(const ScopedKernelLock& lock, | 711 void Directory::DeleteEntry(const ScopedKernelLock& lock, |
712 bool save_to_journal, | 712 bool save_to_journal, |
713 EntryKernel* entry, | 713 EntryKernel* entry_ptr, |
714 OwnedEntryKernelSet* entries_to_journal) { | 714 OwnedEntryKernelSet* entries_to_journal) { |
715 int64_t handle = entry->ref(META_HANDLE); | 715 int64_t handle = entry_ptr->ref(META_HANDLE); |
716 ModelType server_type = | |
717 GetModelTypeFromSpecifics(entry->ref(SERVER_SPECIFICS)); | |
718 | 716 |
719 kernel_->metahandles_to_purge.insert(handle); | 717 kernel_->metahandles_to_purge.insert(handle); |
720 | 718 |
721 std::unique_ptr<EntryKernel> entry_ptr = | 719 std::unique_ptr<EntryKernel> entry = |
722 std::move(kernel_->metahandles_map[handle]); | 720 std::move(kernel_->metahandles_map[handle]); |
723 | 721 |
| 722 ModelType server_type = |
| 723 GetModelTypeFromSpecifics(entry->ref(SERVER_SPECIFICS)); |
| 724 |
724 size_t num_erased = 0; | 725 size_t num_erased = 0; |
725 num_erased = kernel_->metahandles_map.erase(handle); | 726 num_erased = kernel_->metahandles_map.erase(handle); |
726 DCHECK_EQ(1u, num_erased); | 727 DCHECK_EQ(1u, num_erased); |
727 num_erased = kernel_->ids_map.erase(entry->ref(ID).value()); | 728 num_erased = kernel_->ids_map.erase(entry->ref(ID).value()); |
728 DCHECK_EQ(1u, num_erased); | 729 DCHECK_EQ(1u, num_erased); |
729 num_erased = kernel_->unsynced_metahandles.erase(handle); | 730 num_erased = kernel_->unsynced_metahandles.erase(handle); |
730 DCHECK_EQ(entry->ref(IS_UNSYNCED), num_erased > 0); | 731 DCHECK_EQ(entry->ref(IS_UNSYNCED), num_erased > 0); |
731 num_erased = kernel_->unapplied_update_metahandles[server_type].erase(handle); | 732 num_erased = kernel_->unapplied_update_metahandles[server_type].erase(handle); |
732 DCHECK_EQ(entry->ref(IS_UNAPPLIED_UPDATE), num_erased > 0); | 733 DCHECK_EQ(entry->ref(IS_UNAPPLIED_UPDATE), num_erased > 0); |
733 if (kernel_->parent_child_index.Contains(entry)) | 734 if (kernel_->parent_child_index.Contains(entry.get())) |
734 kernel_->parent_child_index.Remove(entry); | 735 kernel_->parent_child_index.Remove(entry.get()); |
735 | 736 |
736 if (!entry->ref(UNIQUE_CLIENT_TAG).empty()) { | 737 if (!entry->ref(UNIQUE_CLIENT_TAG).empty()) { |
737 num_erased = kernel_->client_tags_map.erase(entry->ref(UNIQUE_CLIENT_TAG)); | 738 num_erased = kernel_->client_tags_map.erase(entry->ref(UNIQUE_CLIENT_TAG)); |
738 DCHECK_EQ(1u, num_erased); | 739 DCHECK_EQ(1u, num_erased); |
739 } | 740 } |
740 if (!entry->ref(UNIQUE_SERVER_TAG).empty()) { | 741 if (!entry->ref(UNIQUE_SERVER_TAG).empty()) { |
741 num_erased = kernel_->server_tags_map.erase(entry->ref(UNIQUE_SERVER_TAG)); | 742 num_erased = kernel_->server_tags_map.erase(entry->ref(UNIQUE_SERVER_TAG)); |
742 DCHECK_EQ(1u, num_erased); | 743 DCHECK_EQ(1u, num_erased); |
743 } | 744 } |
744 RemoveFromAttachmentIndex(lock, handle, entry->ref(ATTACHMENT_METADATA)); | 745 RemoveFromAttachmentIndex(lock, handle, entry->ref(ATTACHMENT_METADATA)); |
745 | 746 |
746 if (save_to_journal) { | 747 if (save_to_journal) { |
747 entries_to_journal->insert(std::move(entry_ptr)); | 748 entries_to_journal->insert(std::move(entry)); |
748 } | 749 } |
749 } | 750 } |
750 | 751 |
751 void Directory::PurgeEntriesWithTypeIn(ModelTypeSet disabled_types, | 752 void Directory::PurgeEntriesWithTypeIn(ModelTypeSet disabled_types, |
752 ModelTypeSet types_to_journal, | 753 ModelTypeSet types_to_journal, |
753 ModelTypeSet types_to_unapply) { | 754 ModelTypeSet types_to_unapply) { |
754 disabled_types.RemoveAll(ProxyTypes()); | 755 disabled_types.RemoveAll(ProxyTypes()); |
755 if (disabled_types.Empty()) | 756 if (disabled_types.Empty()) |
756 return; | 757 return; |
757 | 758 |
(...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1633 Directory::Kernel* Directory::kernel() { | 1634 Directory::Kernel* Directory::kernel() { |
1634 return kernel_; | 1635 return kernel_; |
1635 } | 1636 } |
1636 | 1637 |
1637 const Directory::Kernel* Directory::kernel() const { | 1638 const Directory::Kernel* Directory::kernel() const { |
1638 return kernel_; | 1639 return kernel_; |
1639 } | 1640 } |
1640 | 1641 |
1641 } // namespace syncable | 1642 } // namespace syncable |
1642 } // namespace syncer | 1643 } // namespace syncer |
OLD | NEW |