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

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.cc

Issue 558603002: [SyncFS] Make MetadataDatabase operations synchronous (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@01_create
Patch Set: +TODO Created 6 years, 3 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
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 "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h " 5 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h "
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 return; 363 return;
364 } 364 }
365 365
366 const FileDetails& remote_details = remote_file_metadata.details(); 366 const FileDetails& remote_details = remote_file_metadata.details();
367 base::FilePath title = storage::VirtualPath::BaseName(target_path_); 367 base::FilePath title = storage::VirtualPath::BaseName(target_path_);
368 if (!remote_details.missing() && 368 if (!remote_details.missing() &&
369 remote_details.file_kind() == FILE_KIND_FOLDER && 369 remote_details.file_kind() == FILE_KIND_FOLDER &&
370 remote_details.title() == title.AsUTF8Unsafe() && 370 remote_details.title() == title.AsUTF8Unsafe() &&
371 HasFileAsParent(remote_details, 371 HasFileAsParent(remote_details,
372 remote_parent_folder_tracker_->file_id())) { 372 remote_parent_folder_tracker_->file_id())) {
373
374 MoveToBackground( 373 MoveToBackground(
375 base::Bind(&LocalToRemoteSyncer::UpdateTrackerForReusedFolder, 374 base::Bind(&LocalToRemoteSyncer::UpdateTrackerForReusedFolder,
376 weak_ptr_factory_.GetWeakPtr(), 375 weak_ptr_factory_.GetWeakPtr(),
377 remote_details), 376 remote_details),
378 token.Pass()); 377 token.Pass());
379 return; 378 return;
380 } 379 }
381 380
382 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder, 381 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder,
383 weak_ptr_factory_.GetWeakPtr()), 382 weak_ptr_factory_.GetWeakPtr()),
384 token.Pass()); 383 token.Pass());
385 } 384 }
386 385
387 void LocalToRemoteSyncer::UpdateTrackerForReusedFolder( 386 void LocalToRemoteSyncer::UpdateTrackerForReusedFolder(
388 const FileDetails& details, 387 const FileDetails& details,
389 scoped_ptr<SyncTaskToken> token) { 388 scoped_ptr<SyncTaskToken> token) {
390 metadata_database()->UpdateTracker( 389 SyncStatusCode status = metadata_database()->UpdateTracker(
391 remote_file_tracker_->tracker_id(), details, 390 remote_file_tracker_->tracker_id(), details);
392 base::Bind(&LocalToRemoteSyncer::SyncCompleted, 391 SyncCompleted(token.Pass(), status);
393 weak_ptr_factory_.GetWeakPtr(),
394 base::Passed(&token)));
395 } 392 }
396 393
397 void LocalToRemoteSyncer::HandleExistingRemoteFile( 394 void LocalToRemoteSyncer::HandleExistingRemoteFile(
398 scoped_ptr<SyncTaskToken> token) { 395 scoped_ptr<SyncTaskToken> token) {
399 DCHECK(remote_file_tracker_); 396 DCHECK(remote_file_tracker_);
400 DCHECK(!remote_file_tracker_->dirty()); 397 DCHECK(!remote_file_tracker_->dirty());
401 DCHECK(remote_file_tracker_->active()); 398 DCHECK(remote_file_tracker_->active());
402 DCHECK(remote_file_tracker_->has_synced_details()); 399 DCHECK(remote_file_tracker_->has_synced_details());
403 400
404 if (local_is_missing_) { 401 if (local_is_missing_) {
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 SyncCompleted(token.Pass(), status); 472 SyncCompleted(token.Pass(), status);
476 return; 473 return;
477 } 474 }
478 475
479 // Handle NOT_FOUND case as SUCCESS case. 476 // Handle NOT_FOUND case as SUCCESS case.
480 // For PRECONDITION / CONFLICT case, the remote file is modified since the 477 // For PRECONDITION / CONFLICT case, the remote file is modified since the
481 // last sync completed. As our policy for deletion-modification conflict 478 // last sync completed. As our policy for deletion-modification conflict
482 // resolution, ignore the local deletion. 479 // resolution, ignore the local deletion.
483 if (status == SYNC_STATUS_OK || 480 if (status == SYNC_STATUS_OK ||
484 error == google_apis::HTTP_NOT_FOUND) { 481 error == google_apis::HTTP_NOT_FOUND) {
485 metadata_database()->UpdateByDeletedRemoteFile( 482 SyncStatusCode status = metadata_database()->UpdateByDeletedRemoteFile(
486 remote_file_tracker_->file_id(), 483 remote_file_tracker_->file_id());
487 base::Bind(&LocalToRemoteSyncer::SyncCompleted, 484 SyncCompleted(token.Pass(), status);
488 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)));
489 return; 485 return;
490 } 486 }
491 487
492 SyncCompleted(token.Pass(), SYNC_STATUS_OK); 488 SyncCompleted(token.Pass(), SYNC_STATUS_OK);
493 } 489 }
494 490
495 void LocalToRemoteSyncer::UploadExistingFile(scoped_ptr<SyncTaskToken> token) { 491 void LocalToRemoteSyncer::UploadExistingFile(scoped_ptr<SyncTaskToken> token) {
496 DCHECK(remote_file_tracker_); 492 DCHECK(remote_file_tracker_);
497 DCHECK(remote_file_tracker_->has_synced_details()); 493 DCHECK(remote_file_tracker_->has_synced_details());
498 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); 494 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread());
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 return; 540 return;
545 } 541 }
546 542
547 if (!entry) { 543 if (!entry) {
548 NOTREACHED(); 544 NOTREACHED();
549 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); 545 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED);
550 return; 546 return;
551 } 547 }
552 548
553 DCHECK(entry); 549 DCHECK(entry);
554 metadata_database()->UpdateByFileResource( 550 status = metadata_database()->UpdateByFileResource(*entry);
555 *entry, 551
556 base::Bind(&LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile, 552 // TODO(tzik): Expand this function.
557 weak_ptr_factory_.GetWeakPtr(), 553 DidUpdateDatabaseForUploadExistingFile(token.Pass(), status);
558 base::Passed(&token)));
559 } 554 }
560 555
561 void LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile( 556 void LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile(
562 scoped_ptr<SyncTaskToken> token, 557 scoped_ptr<SyncTaskToken> token,
563 SyncStatusCode status) { 558 SyncStatusCode status) {
564 if (status != SYNC_STATUS_OK) { 559 if (status != SYNC_STATUS_OK) {
565 SyncCompleted(token.Pass(), status); 560 SyncCompleted(token.Pass(), status);
566 return; 561 return;
567 } 562 }
568 563
569 FileMetadata file; 564 FileMetadata file;
570 if (!metadata_database()->FindFileByFileID( 565 if (!metadata_database()->FindFileByFileID(
571 remote_file_tracker_->file_id(), &file)) { 566 remote_file_tracker_->file_id(), &file)) {
572 NOTREACHED(); 567 NOTREACHED();
573 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); 568 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED);
574 return; 569 return;
575 } 570 }
576 571
577 const FileDetails& details = file.details(); 572 const FileDetails& details = file.details();
578 base::FilePath title = storage::VirtualPath::BaseName(target_path_); 573 base::FilePath title = storage::VirtualPath::BaseName(target_path_);
579 if (!details.missing() && 574 if (!details.missing() &&
580 details.file_kind() == FILE_KIND_FILE && 575 details.file_kind() == FILE_KIND_FILE &&
581 details.title() == title.AsUTF8Unsafe() && 576 details.title() == title.AsUTF8Unsafe() &&
582 HasFileAsParent(details, 577 HasFileAsParent(details,
583 remote_parent_folder_tracker_->file_id())) { 578 remote_parent_folder_tracker_->file_id())) {
584 metadata_database()->UpdateTracker( 579 SyncStatusCode status = metadata_database()->UpdateTracker(
585 remote_file_tracker_->tracker_id(), 580 remote_file_tracker_->tracker_id(), file.details());
586 file.details(), 581 SyncCompleted(token.Pass(), status);
587 base::Bind(&LocalToRemoteSyncer::SyncCompleted,
588 weak_ptr_factory_.GetWeakPtr(),
589 base::Passed(&token)));
590 return; 582 return;
591 } 583 }
592 584
593 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); 585 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY);
594 } 586 }
595 587
596 void LocalToRemoteSyncer::UpdateRemoteMetadata( 588 void LocalToRemoteSyncer::UpdateRemoteMetadata(
597 const std::string& file_id, 589 const std::string& file_id,
598 scoped_ptr<SyncTaskToken> token) { 590 scoped_ptr<SyncTaskToken> token) {
599 DCHECK(remote_file_tracker_); 591 DCHECK(remote_file_tracker_);
600 592
601 drive_service()->GetFileResource( 593 drive_service()->GetFileResource(
602 file_id, 594 file_id,
603 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, 595 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata,
604 weak_ptr_factory_.GetWeakPtr(), 596 weak_ptr_factory_.GetWeakPtr(),
605 file_id, base::Passed(&token))); 597 file_id, base::Passed(&token)));
606 } 598 }
607 599
608 void LocalToRemoteSyncer::DidGetRemoteMetadata( 600 void LocalToRemoteSyncer::DidGetRemoteMetadata(
609 const std::string& file_id, 601 const std::string& file_id,
610 scoped_ptr<SyncTaskToken> token, 602 scoped_ptr<SyncTaskToken> token,
611 google_apis::GDataErrorCode error, 603 google_apis::GDataErrorCode error,
612 scoped_ptr<google_apis::FileResource> entry) { 604 scoped_ptr<google_apis::FileResource> entry) {
613 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); 605 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread());
614 606
615 if (error == google_apis::HTTP_NOT_FOUND) { 607 if (error == google_apis::HTTP_NOT_FOUND) {
616 retry_on_success_ = true; 608 retry_on_success_ = true;
617 metadata_database()->UpdateByDeletedRemoteFile( 609 SyncStatusCode status =
618 file_id, 610 metadata_database()->UpdateByDeletedRemoteFile(file_id);
619 base::Bind(&LocalToRemoteSyncer::SyncCompleted, 611 SyncCompleted(token.Pass(), status);
620 weak_ptr_factory_.GetWeakPtr(),
621 base::Passed(&token)));
622 return; 612 return;
623 } 613 }
624 614
625 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); 615 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error);
626 if (status != SYNC_STATUS_OK) { 616 if (status != SYNC_STATUS_OK) {
627 SyncCompleted(token.Pass(), status); 617 SyncCompleted(token.Pass(), status);
628 return; 618 return;
629 } 619 }
630 620
631 if (!entry) { 621 if (!entry) {
632 NOTREACHED(); 622 NOTREACHED();
633 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); 623 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED);
634 return; 624 return;
635 } 625 }
636 626
637 retry_on_success_ = true; 627 retry_on_success_ = true;
638 metadata_database()->UpdateByFileResource( 628 status = metadata_database()->UpdateByFileResource(*entry);
639 *entry, 629 SyncCompleted(token.Pass(), status);
640 base::Bind(&LocalToRemoteSyncer::SyncCompleted,
641 weak_ptr_factory_.GetWeakPtr(),
642 base::Passed(&token)));
643 } 630 }
644 631
645 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { 632 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) {
646 DCHECK(remote_parent_folder_tracker_); 633 DCHECK(remote_parent_folder_tracker_);
647 634
648 sync_action_ = SYNC_ACTION_ADDED; 635 sync_action_ = SYNC_ACTION_ADDED;
649 base::FilePath title = storage::VirtualPath::BaseName(target_path_); 636 base::FilePath title = storage::VirtualPath::BaseName(target_path_);
650 drive_uploader()->UploadNewFile( 637 drive_uploader()->UploadNewFile(
651 remote_parent_folder_tracker_->file_id(), 638 remote_parent_folder_tracker_->file_id(),
652 local_path_, 639 local_path_,
(...skipping 19 matching lines...) Expand all
672 SyncCompleted(token.Pass(), status); 659 SyncCompleted(token.Pass(), status);
673 return; 660 return;
674 } 661 }
675 662
676 if (!entry) { 663 if (!entry) {
677 NOTREACHED(); 664 NOTREACHED();
678 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); 665 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED);
679 return; 666 return;
680 } 667 }
681 668
682 metadata_database()->ReplaceActiveTrackerWithNewResource( 669 status = metadata_database()->ReplaceActiveTrackerWithNewResource(
683 remote_parent_folder_tracker_->tracker_id(), *entry, 670 remote_parent_folder_tracker_->tracker_id(), *entry);
684 base::Bind(&LocalToRemoteSyncer::SyncCompleted, 671 SyncCompleted(token.Pass(), status);
685 weak_ptr_factory_.GetWeakPtr(),
686 base::Passed(&token)));
687 } 672 }
688 673
689 void LocalToRemoteSyncer::CreateRemoteFolder( 674 void LocalToRemoteSyncer::CreateRemoteFolder(
690 scoped_ptr<SyncTaskToken> token) { 675 scoped_ptr<SyncTaskToken> token) {
691 DCHECK(remote_parent_folder_tracker_); 676 DCHECK(remote_parent_folder_tracker_);
692 677
693 base::FilePath title = storage::VirtualPath::BaseName(target_path_); 678 base::FilePath title = storage::VirtualPath::BaseName(target_path_);
694 sync_action_ = SYNC_ACTION_ADDED; 679 sync_action_ = SYNC_ACTION_ADDED;
695 680
696 DCHECK(!folder_creator_); 681 DCHECK(!folder_creator_);
(...skipping 13 matching lines...) Expand all
710 SyncStatusCode status) { 695 SyncStatusCode status) {
711 if (status == SYNC_FILE_ERROR_NOT_FOUND) 696 if (status == SYNC_FILE_ERROR_NOT_FOUND)
712 needs_remote_change_listing_ = true; 697 needs_remote_change_listing_ = true;
713 698
714 scoped_ptr<FolderCreator> deleter = folder_creator_.Pass(); 699 scoped_ptr<FolderCreator> deleter = folder_creator_.Pass();
715 if (status != SYNC_STATUS_OK) { 700 if (status != SYNC_STATUS_OK) {
716 SyncCompleted(token.Pass(), status); 701 SyncCompleted(token.Pass(), status);
717 return; 702 return;
718 } 703 }
719 704
705 status = SYNC_STATUS_FAILED;
720 MetadataDatabase::ActivationStatus activation_status = 706 MetadataDatabase::ActivationStatus activation_status =
721 metadata_database()->TryActivateTracker( 707 metadata_database()->TryActivateTracker(
722 remote_parent_folder_tracker_->tracker_id(), 708 remote_parent_folder_tracker_->tracker_id(),
723 file_id, 709 file_id, &status);
724 base::Bind(&LocalToRemoteSyncer::SyncCompleted,
725 weak_ptr_factory_.GetWeakPtr(),
726 base::Passed(token.Pass())));
727 switch (activation_status) { 710 switch (activation_status) {
728 case MetadataDatabase::ACTIVATION_PENDING: 711 case MetadataDatabase::ACTIVATION_PENDING:
729 // The task will be finalized by the callback passed to MetadataDatabase 712 SyncCompleted(token.Pass(), status);
730 // in this case.
731 return; 713 return;
732 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER: 714 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER:
733 // The activation failed due to another tracker that has another parent. 715 // The activation failed due to another tracker that has another parent.
734 // Detach the folder from the current parent to avoid using this folder as 716 // Detach the folder from the current parent to avoid using this folder as
735 // active folder. 717 // active folder.
736 drive_service()->RemoveResourceFromDirectory( 718 drive_service()->RemoveResourceFromDirectory(
737 remote_parent_folder_tracker_->file_id(), file_id, 719 remote_parent_folder_tracker_->file_id(), file_id,
738 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict, 720 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict,
739 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); 721 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)));
740 return; 722 return;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 set_used_network(true); 754 set_used_network(true);
773 return sync_context_->GetDriveUploader(); 755 return sync_context_->GetDriveUploader();
774 } 756 }
775 757
776 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { 758 MetadataDatabase* LocalToRemoteSyncer::metadata_database() {
777 return sync_context_->GetMetadataDatabase(); 759 return sync_context_->GetMetadataDatabase();
778 } 760 }
779 761
780 } // namespace drive_backend 762 } // namespace drive_backend
781 } // namespace sync_file_system 763 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698