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

Side by Side Diff: chrome/browser/sync_file_system/local/local_file_sync_context.cc

Issue 23578026: Use SNAPSHOT sync mode for LocalSync (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased on thread_bundle fix Created 7 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 | Annotate | Revision Log
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/local/local_file_sync_context.h" 5 #include "chrome/browser/sync_file_system/local/local_file_sync_context.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/file_util.h"
8 #include "base/location.h" 9 #include "base/location.h"
9 #include "base/platform_file.h" 10 #include "base/platform_file.h"
10 #include "base/single_thread_task_runner.h" 11 #include "base/single_thread_task_runner.h"
11 #include "base/stl_util.h" 12 #include "base/stl_util.h"
12 #include "base/task_runner_util.h" 13 #include "base/task_runner_util.h"
13 #include "chrome/browser/sync_file_system/file_change.h" 14 #include "chrome/browser/sync_file_system/file_change.h"
14 #include "chrome/browser/sync_file_system/local/local_file_change_tracker.h" 15 #include "chrome/browser/sync_file_system/local/local_file_change_tracker.h"
15 #include "chrome/browser/sync_file_system/local/local_origin_change_observer.h" 16 #include "chrome/browser/sync_file_system/local/local_origin_change_observer.h"
16 #include "chrome/browser/sync_file_system/local/sync_file_system_backend.h" 17 #include "chrome/browser/sync_file_system/local/sync_file_system_backend.h"
17 #include "chrome/browser/sync_file_system/local/syncable_file_operation_runner.h " 18 #include "chrome/browser/sync_file_system/local/syncable_file_operation_runner.h "
18 #include "chrome/browser/sync_file_system/sync_file_metadata.h" 19 #include "chrome/browser/sync_file_system/sync_file_metadata.h"
19 #include "chrome/browser/sync_file_system/syncable_file_system_util.h" 20 #include "chrome/browser/sync_file_system/syncable_file_system_util.h"
20 #include "webkit/browser/fileapi/file_system_context.h" 21 #include "webkit/browser/fileapi/file_system_context.h"
21 #include "webkit/browser/fileapi/file_system_file_util.h" 22 #include "webkit/browser/fileapi/file_system_file_util.h"
22 #include "webkit/browser/fileapi/file_system_operation_context.h" 23 #include "webkit/browser/fileapi/file_system_operation_context.h"
23 #include "webkit/browser/fileapi/file_system_operation_runner.h" 24 #include "webkit/browser/fileapi/file_system_operation_runner.h"
25 #include "webkit/common/blob/scoped_file.h"
24 #include "webkit/common/fileapi/file_system_util.h" 26 #include "webkit/common/fileapi/file_system_util.h"
25 27
26 using fileapi::FileSystemContext; 28 using fileapi::FileSystemContext;
27 using fileapi::FileSystemFileUtil; 29 using fileapi::FileSystemFileUtil;
28 using fileapi::FileSystemOperation; 30 using fileapi::FileSystemOperation;
29 using fileapi::FileSystemOperationContext; 31 using fileapi::FileSystemOperationContext;
30 using fileapi::FileSystemURL; 32 using fileapi::FileSystemURL;
31 33
32 namespace sync_file_system { 34 namespace sync_file_system {
33 35
34 namespace { 36 namespace {
35 37
36 const int kMaxConcurrentSyncableOperation = 3; 38 const int kMaxConcurrentSyncableOperation = 3;
37 const int kNotifyChangesDurationInSec = 1; 39 const int kNotifyChangesDurationInSec = 1;
38 const int kMaxURLsToFetchForLocalSync = 5; 40 const int kMaxURLsToFetchForLocalSync = 5;
39 41
42 const base::FilePath::CharType kSnapshotDir[] = FILE_PATH_LITERAL("snapshots");
43
40 } // namespace 44 } // namespace
41 45
42 LocalFileSyncContext::LocalFileSyncContext( 46 LocalFileSyncContext::LocalFileSyncContext(
47 const base::FilePath& base_path,
43 base::SingleThreadTaskRunner* ui_task_runner, 48 base::SingleThreadTaskRunner* ui_task_runner,
44 base::SingleThreadTaskRunner* io_task_runner) 49 base::SingleThreadTaskRunner* io_task_runner)
45 : ui_task_runner_(ui_task_runner), 50 : local_base_path_(base_path.Append(FILE_PATH_LITERAL("local"))),
51 ui_task_runner_(ui_task_runner),
46 io_task_runner_(io_task_runner), 52 io_task_runner_(io_task_runner),
47 shutdown_on_ui_(false), 53 shutdown_on_ui_(false),
48 mock_notify_changes_duration_in_sec_(-1) { 54 mock_notify_changes_duration_in_sec_(-1) {
49 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); 55 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
50 } 56 }
51 57
52 void LocalFileSyncContext::MaybeInitializeFileSystemContext( 58 void LocalFileSyncContext::MaybeInitializeFileSystemContext(
53 const GURL& source_url, 59 const GURL& source_url,
54 FileSystemContext* file_system_context, 60 FileSystemContext* file_system_context,
55 const SyncStatusCallback& callback) { 61 const SyncStatusCallback& callback) {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 158
153 if (sync_finish_status == SYNC_STATUS_OK || 159 if (sync_finish_status == SYNC_STATUS_OK ||
154 sync_finish_status == SYNC_STATUS_HAS_CONFLICT) { 160 sync_finish_status == SYNC_STATUS_HAS_CONFLICT) {
155 // Commit the in-memory mirror change. 161 // Commit the in-memory mirror change.
156 backend->change_tracker()->ResetToMirrorAndCommitChangesForURL(url); 162 backend->change_tracker()->ResetToMirrorAndCommitChangesForURL(url);
157 } else { 163 } else {
158 // Abort in-memory mirror change. 164 // Abort in-memory mirror change.
159 backend->change_tracker()->RemoveMirrorAndCommitChangesForURL(url); 165 backend->change_tracker()->RemoveMirrorAndCommitChangesForURL(url);
160 } 166 }
161 167
168 // We've been keeping it in writing mode, so clear the writing counter
169 // to unblock sync activities.
170 io_task_runner_->PostTask(
171 FROM_HERE, base::Bind(&LocalFileSyncContext::EndWritingOnIOThread,
172 this, url));
173
162 // Call the completion callback on UI thread. 174 // Call the completion callback on UI thread.
163 ui_task_runner_->PostTask(FROM_HERE, done_callback); 175 ui_task_runner_->PostTask(FROM_HERE, done_callback);
164 } 176 }
165 177
166 void LocalFileSyncContext::ClearSyncFlagForURL(const FileSystemURL& url) { 178 void LocalFileSyncContext::ClearSyncFlagForURL(const FileSystemURL& url) {
167 // This is initially called on UI thread and to be relayed to IO thread. 179 // This is initially called on UI thread and to be relayed to IO thread.
168 io_task_runner_->PostTask( 180 io_task_runner_->PostTask(
169 FROM_HERE, 181 FROM_HERE,
170 base::Bind(&LocalFileSyncContext::EnableWritingOnIOThread, 182 base::Bind(&LocalFileSyncContext::ClearSyncFlagOnIOThread,
171 this, url, true /* may_have_updates */)); 183 this, url, false /* keep_url_in_writing */));
172 } 184 }
173 185
174 void LocalFileSyncContext::PrepareForSync( 186 void LocalFileSyncContext::PrepareForSync(
175 FileSystemContext* file_system_context, 187 FileSystemContext* file_system_context,
176 const FileSystemURL& url, 188 const FileSystemURL& url,
177 SyncMode sync_mode, 189 SyncMode sync_mode,
178 const LocalFileSyncInfoCallback& callback) { 190 const LocalFileSyncInfoCallback& callback) {
179 // This is initially called on UI thread and to be relayed to IO thread. 191 // This is initially called on UI thread and to be relayed to IO thread.
180 if (!io_task_runner_->RunsTasksOnCurrentThread()) { 192 if (!io_task_runner_->RunsTasksOnCurrentThread()) {
181 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); 193 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 if (status != SYNC_STATUS_OK) 555 if (status != SYNC_STATUS_OK)
544 return status; 556 return status;
545 557
546 // Get all origins that have pending changes. 558 // Get all origins that have pending changes.
547 std::deque<FileSystemURL> urls; 559 std::deque<FileSystemURL> urls;
548 (*tracker_ptr)->GetNextChangedURLs(&urls, 0); 560 (*tracker_ptr)->GetNextChangedURLs(&urls, 0);
549 for (std::deque<FileSystemURL>::iterator iter = urls.begin(); 561 for (std::deque<FileSystemURL>::iterator iter = urls.begin();
550 iter != urls.end(); ++iter) { 562 iter != urls.end(); ++iter) {
551 origins_with_changes->insert(iter->origin()); 563 origins_with_changes->insert(iter->origin());
552 } 564 }
565
566 // Creates snapshot directory.
567 file_util::CreateDirectory(local_base_path_.Append(kSnapshotDir));
568
553 return status; 569 return status;
554 } 570 }
555 571
556 void LocalFileSyncContext::DidInitializeChangeTrackerOnIOThread( 572 void LocalFileSyncContext::DidInitializeChangeTrackerOnIOThread(
557 scoped_ptr<LocalFileChangeTracker>* tracker_ptr, 573 scoped_ptr<LocalFileChangeTracker>* tracker_ptr,
558 const GURL& source_url, 574 const GURL& source_url,
559 FileSystemContext* file_system_context, 575 FileSystemContext* file_system_context,
560 std::set<GURL>* origins_with_changes, 576 std::set<GURL>* origins_with_changes,
561 SyncStatusCode status) { 577 SyncStatusCode status) {
562 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 578 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 } 642 }
627 643
628 void LocalFileSyncContext::TryPrepareForLocalSync( 644 void LocalFileSyncContext::TryPrepareForLocalSync(
629 FileSystemContext* file_system_context, 645 FileSystemContext* file_system_context,
630 std::deque<FileSystemURL>* urls, 646 std::deque<FileSystemURL>* urls,
631 const LocalFileSyncInfoCallback& callback) { 647 const LocalFileSyncInfoCallback& callback) {
632 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); 648 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
633 DCHECK(urls); 649 DCHECK(urls);
634 650
635 if (shutdown_on_ui_) { 651 if (shutdown_on_ui_) {
636 callback.Run(SYNC_STATUS_ABORT, LocalFileSyncInfo()); 652 callback.Run(SYNC_STATUS_ABORT, LocalFileSyncInfo(),
653 scoped_ptr<webkit_blob::ScopedFile>());
637 return; 654 return;
638 } 655 }
639 656
640 if (urls->empty()) { 657 if (urls->empty()) {
641 callback.Run(SYNC_STATUS_NO_CHANGE_TO_SYNC, 658 callback.Run(SYNC_STATUS_NO_CHANGE_TO_SYNC, LocalFileSyncInfo(),
642 LocalFileSyncInfo()); 659 scoped_ptr<webkit_blob::ScopedFile>());
643 return; 660 return;
644 } 661 }
645 662
646 const FileSystemURL url = urls->front(); 663 const FileSystemURL url = urls->front();
647 urls->pop_front(); 664 urls->pop_front();
648 std::deque<FileSystemURL>* remaining = new std::deque<FileSystemURL>; 665 std::deque<FileSystemURL>* remaining = new std::deque<FileSystemURL>;
649 remaining->swap(*urls); 666 remaining->swap(*urls);
650 667
651 // TODO(kinuko): Call PrepareForSync with SYNC_SNAPSHOT when it becomes ready.
652 PrepareForSync( 668 PrepareForSync(
653 file_system_context, url, SYNC_EXCLUSIVE, 669 file_system_context, url, SYNC_SNAPSHOT,
654 base::Bind(&LocalFileSyncContext::DidTryPrepareForLocalSync, 670 base::Bind(&LocalFileSyncContext::DidTryPrepareForLocalSync,
655 this, make_scoped_refptr(file_system_context), 671 this, make_scoped_refptr(file_system_context),
656 base::Owned(remaining), callback)); 672 base::Owned(remaining), callback));
657 } 673 }
658 674
659 void LocalFileSyncContext::DidTryPrepareForLocalSync( 675 void LocalFileSyncContext::DidTryPrepareForLocalSync(
660 FileSystemContext* file_system_context, 676 FileSystemContext* file_system_context,
661 std::deque<FileSystemURL>* remaining_urls, 677 std::deque<FileSystemURL>* remaining_urls,
662 const LocalFileSyncInfoCallback& callback, 678 const LocalFileSyncInfoCallback& callback,
663 SyncStatusCode status, 679 SyncStatusCode status,
664 const LocalFileSyncInfo& sync_file_info) { 680 const LocalFileSyncInfo& sync_file_info,
681 scoped_ptr<webkit_blob::ScopedFile> snapshot) {
665 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); 682 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
666 if (status != SYNC_STATUS_FILE_BUSY) { 683 if (status != SYNC_STATUS_FILE_BUSY) {
667 callback.Run(status, sync_file_info); 684 callback.Run(status, sync_file_info, snapshot.Pass());
668 return; 685 return;
669 } 686 }
670 // Recursively call TryPrepareForLocalSync with remaining_urls. 687 // Recursively call TryPrepareForLocalSync with remaining_urls.
671 TryPrepareForLocalSync(file_system_context, remaining_urls, callback); 688 TryPrepareForLocalSync(file_system_context, remaining_urls, callback);
672 } 689 }
673 690
674 void LocalFileSyncContext::DidGetWritingStatusForSync( 691 void LocalFileSyncContext::DidGetWritingStatusForSync(
675 FileSystemContext* file_system_context, 692 FileSystemContext* file_system_context,
676 SyncStatusCode status, 693 SyncStatusCode status,
677 const FileSystemURL& url, 694 const FileSystemURL& url,
678 SyncMode sync_mode, 695 SyncMode sync_mode,
679 const LocalFileSyncInfoCallback& callback) { 696 const LocalFileSyncInfoCallback& callback) {
680 // This gets called on UI thread and relays the task on FILE thread. 697 // This gets called on UI thread and relays the task on FILE thread.
681 DCHECK(file_system_context); 698 DCHECK(file_system_context);
682 if (!file_system_context->default_file_task_runner()-> 699 if (!file_system_context->default_file_task_runner()->
683 RunsTasksOnCurrentThread()) { 700 RunsTasksOnCurrentThread()) {
684 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); 701 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
685 if (shutdown_on_ui_) { 702 if (shutdown_on_ui_) {
686 callback.Run(SYNC_STATUS_ABORT, LocalFileSyncInfo()); 703 callback.Run(SYNC_STATUS_ABORT, LocalFileSyncInfo(),
704 scoped_ptr<webkit_blob::ScopedFile>());
687 return; 705 return;
688 } 706 }
689 file_system_context->default_file_task_runner()->PostTask( 707 file_system_context->default_file_task_runner()->PostTask(
690 FROM_HERE, 708 FROM_HERE,
691 base::Bind(&LocalFileSyncContext::DidGetWritingStatusForSync, 709 base::Bind(&LocalFileSyncContext::DidGetWritingStatusForSync,
692 this, make_scoped_refptr(file_system_context), 710 this, make_scoped_refptr(file_system_context),
693 status, url, sync_mode, callback)); 711 status, url, sync_mode, callback));
694 return; 712 return;
695 } 713 }
696 714
697 SyncFileSystemBackend* backend = 715 SyncFileSystemBackend* backend =
698 SyncFileSystemBackend::GetBackend(file_system_context); 716 SyncFileSystemBackend::GetBackend(file_system_context);
699 DCHECK(backend); 717 DCHECK(backend);
700 DCHECK(backend->change_tracker()); 718 DCHECK(backend->change_tracker());
701 FileChangeList changes; 719 FileChangeList changes;
702 backend->change_tracker()->GetChangesForURL(url, &changes); 720 backend->change_tracker()->GetChangesForURL(url, &changes);
703 721
704 base::FilePath platform_path; 722 base::FilePath platform_path;
705 base::PlatformFileInfo file_info; 723 base::PlatformFileInfo file_info;
706 FileSystemFileUtil* file_util = 724 FileSystemFileUtil* file_util =
707 file_system_context->sandbox_delegate()->sync_file_util(); 725 file_system_context->sandbox_delegate()->sync_file_util();
708 DCHECK(file_util); 726 DCHECK(file_util);
709 727
710 base::PlatformFileError file_error = file_util->GetFileInfo( 728 base::PlatformFileError file_error = file_util->GetFileInfo(
711 make_scoped_ptr( 729 make_scoped_ptr(
712 new FileSystemOperationContext(file_system_context)).get(), 730 new FileSystemOperationContext(file_system_context)).get(),
713 url, 731 url,
714 &file_info, 732 &file_info,
715 &platform_path); 733 &platform_path);
734
735 scoped_ptr<webkit_blob::ScopedFile> snapshot;
716 if (file_error == base::PLATFORM_FILE_OK && sync_mode == SYNC_SNAPSHOT) { 736 if (file_error == base::PLATFORM_FILE_OK && sync_mode == SYNC_SNAPSHOT) {
717 // TODO(kinuko): creates a snapshot file. 737 base::FilePath snapshot_path;
738 file_util::CreateTemporaryFileInDir(local_base_path_.Append(kSnapshotDir),
739 &snapshot_path);
740 if (base::CopyFile(platform_path, snapshot_path)) {
741 platform_path = snapshot_path;
742 snapshot.reset(new webkit_blob::ScopedFile(
743 snapshot_path,
744 webkit_blob::ScopedFile::DELETE_ON_SCOPE_OUT,
745 file_system_context->default_file_task_runner()));
746 }
718 } 747 }
748
719 if (status == SYNC_STATUS_OK && 749 if (status == SYNC_STATUS_OK &&
720 file_error != base::PLATFORM_FILE_OK && 750 file_error != base::PLATFORM_FILE_OK &&
721 file_error != base::PLATFORM_FILE_ERROR_NOT_FOUND) 751 file_error != base::PLATFORM_FILE_ERROR_NOT_FOUND)
722 status = PlatformFileErrorToSyncStatusCode(file_error); 752 status = PlatformFileErrorToSyncStatusCode(file_error);
723 753
724 DCHECK(!file_info.is_symbolic_link); 754 DCHECK(!file_info.is_symbolic_link);
725 755
726 SyncFileType file_type = SYNC_FILE_TYPE_FILE; 756 SyncFileType file_type = SYNC_FILE_TYPE_FILE;
727 if (file_error == base::PLATFORM_FILE_ERROR_NOT_FOUND) 757 if (file_error == base::PLATFORM_FILE_ERROR_NOT_FOUND)
728 file_type = SYNC_FILE_TYPE_UNKNOWN; 758 file_type = SYNC_FILE_TYPE_UNKNOWN;
729 else if (file_info.is_directory) 759 else if (file_info.is_directory)
730 file_type = SYNC_FILE_TYPE_DIRECTORY; 760 file_type = SYNC_FILE_TYPE_DIRECTORY;
731 761
732 // TODO(kinuko): returns the snapshot file path if snapshot is available.
733 LocalFileSyncInfo sync_file_info; 762 LocalFileSyncInfo sync_file_info;
734 sync_file_info.url = url; 763 sync_file_info.url = url;
735 sync_file_info.local_file_path = platform_path; 764 sync_file_info.local_file_path = platform_path;
736 sync_file_info.metadata.file_type = file_type; 765 sync_file_info.metadata.file_type = file_type;
737 sync_file_info.metadata.size = file_info.size; 766 sync_file_info.metadata.size = file_info.size;
738 sync_file_info.metadata.last_modified = file_info.last_modified; 767 sync_file_info.metadata.last_modified = file_info.last_modified;
739 sync_file_info.changes = changes; 768 sync_file_info.changes = changes;
740 769
741 if (status == SYNC_STATUS_OK) { 770 if (status == SYNC_STATUS_OK) {
742 if (!changes.empty()) { 771 if (!changes.empty()) {
743 // Now we create an empty mirror change record for URL (and we record 772 // Now we create an empty mirror change record for URL (and we record
744 // changes to both mirror and original records during sync), so that 773 // changes to both mirror and original records during sync), so that
745 // we can reset to the mirror when the sync succeeds. 774 // we can reset to the mirror when the sync succeeds.
746 backend->change_tracker()->CreateFreshMirrorForURL(url); 775 backend->change_tracker()->CreateFreshMirrorForURL(url);
747 } 776 }
748 777
749 // 'Unlock' the file if sync_mode is not SYNC_EXCLUSIVE. 778 // 'Unlock' the file if sync_mode is not SYNC_EXCLUSIVE.
779 // (But keep it in writing status so that no other sync starts on
780 // the same URL)
750 if (sync_mode != SYNC_EXCLUSIVE) { 781 if (sync_mode != SYNC_EXCLUSIVE) {
751 io_task_runner_->PostTask( 782 io_task_runner_->PostTask(
752 FROM_HERE, 783 FROM_HERE,
753 base::Bind(&LocalFileSyncContext::EnableWritingOnIOThread, 784 base::Bind(&LocalFileSyncContext::ClearSyncFlagOnIOThread,
754 this, url, false /* may_have_updates */)); 785 this, url, true /* keep_url_in_writing */));
755 } 786 }
756 } 787 }
757 788
758 ui_task_runner_->PostTask(FROM_HERE, 789 ui_task_runner_->PostTask(FROM_HERE,
759 base::Bind(callback, status, sync_file_info)); 790 base::Bind(callback, status, sync_file_info,
791 base::Passed(&snapshot)));
760 } 792 }
761 793
762 void LocalFileSyncContext::EnableWritingOnIOThread( 794 void LocalFileSyncContext::ClearSyncFlagOnIOThread(
763 const FileSystemURL& url, 795 const FileSystemURL& url,
764 bool may_have_updates) { 796 bool keep_url_in_writing) {
765 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 797 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
766 if (!sync_status()) { 798 if (!sync_status()) {
767 // The service might have been shut down. 799 // The service might have been shut down.
768 return; 800 return;
769 } 801 }
770 sync_status()->EndSyncing(url); 802 sync_status()->EndSyncing(url);
771 803
772 if (!may_have_updates) 804 if (keep_url_in_writing) {
805 // The caller will hold shared lock on this one.
806 sync_status()->StartWriting(url);
773 return; 807 return;
808 }
774 809
775 // Since a sync has finished the number of changes must have been updated. 810 // Since a sync has finished the number of changes must have been updated.
776 origins_with_pending_changes_.insert(url.origin()); 811 origins_with_pending_changes_.insert(url.origin());
777 ScheduleNotifyChangesUpdatedOnIOThread(); 812 ScheduleNotifyChangesUpdatedOnIOThread();
778 } 813 }
779 814
815 void LocalFileSyncContext::EndWritingOnIOThread(
816 const FileSystemURL& url) {
817 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
818 if (!sync_status()) {
819 // The service might have been shut down.
820 return;
821 }
822 sync_status()->EndWriting(url);
823 }
824
780 void LocalFileSyncContext::DidApplyRemoteChange( 825 void LocalFileSyncContext::DidApplyRemoteChange(
781 const FileSystemURL& url, 826 const FileSystemURL& url,
782 const SyncStatusCallback& callback_on_ui, 827 const SyncStatusCallback& callback_on_ui,
783 base::PlatformFileError file_error) { 828 base::PlatformFileError file_error) {
784 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 829 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
785 ui_task_runner_->PostTask( 830 ui_task_runner_->PostTask(
786 FROM_HERE, 831 FROM_HERE,
787 base::Bind(callback_on_ui, 832 base::Bind(callback_on_ui,
788 PlatformFileErrorToSyncStatusCode(file_error))); 833 PlatformFileErrorToSyncStatusCode(file_error)));
789 EnableWritingOnIOThread(url, true /* may_have_updates */); 834 ClearSyncFlagOnIOThread(url, false /* keep_url_in_writing */);
790 } 835 }
791 836
792 void LocalFileSyncContext::DidGetFileMetadata( 837 void LocalFileSyncContext::DidGetFileMetadata(
793 const SyncFileMetadataCallback& callback, 838 const SyncFileMetadataCallback& callback,
794 base::PlatformFileError file_error, 839 base::PlatformFileError file_error,
795 const base::PlatformFileInfo& file_info) { 840 const base::PlatformFileInfo& file_info) {
796 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 841 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
797 SyncFileMetadata metadata; 842 SyncFileMetadata metadata;
798 if (file_error == base::PLATFORM_FILE_OK) { 843 if (file_error == base::PLATFORM_FILE_OK) {
799 metadata.file_type = file_info.is_directory ? 844 metadata.file_type = file_info.is_directory ?
(...skipping 25 matching lines...) Expand all
825 return; 870 return;
826 } 871 }
827 872
828 FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync( 873 FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync(
829 file_system_context, dest_url); 874 file_system_context, dest_url);
830 file_system_context->operation_runner()->CopyInForeignFile( 875 file_system_context->operation_runner()->CopyInForeignFile(
831 local_path, url_for_sync, callback); 876 local_path, url_for_sync, callback);
832 } 877 }
833 878
834 } // namespace sync_file_system 879 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698