OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/chromeos/drive/job_scheduler.h" | 5 #include "chrome/browser/chromeos/drive/job_scheduler.h" |
6 | 6 |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/prefs/pref_service.h" | 8 #include "base/prefs/pref_service.h" |
9 #include "base/rand_util.h" | 9 #include "base/rand_util.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 JobScheduler::JobEntry* JobScheduler::CreateNewJob(JobType type) { | 697 JobScheduler::JobEntry* JobScheduler::CreateNewJob(JobType type) { |
698 JobEntry* job = new JobEntry(type); | 698 JobEntry* job = new JobEntry(type); |
699 job->job_info.job_id = job_map_.Add(job); // Takes the ownership of |job|. | 699 job->job_info.job_id = job_map_.Add(job); // Takes the ownership of |job|. |
700 return job; | 700 return job; |
701 } | 701 } |
702 | 702 |
703 void JobScheduler::StartJob(JobEntry* job) { | 703 void JobScheduler::StartJob(JobEntry* job) { |
704 DCHECK(!job->task.is_null()); | 704 DCHECK(!job->task.is_null()); |
705 | 705 |
706 QueueJob(job->job_info.job_id); | 706 QueueJob(job->job_info.job_id); |
| 707 QueueType queue_type = GetJobQueueType(job->job_info.job_type); |
| 708 job->job_info.num_total_jobs = queue_[queue_type]->GetNumberOfJobs(); |
707 NotifyJobAdded(job->job_info); | 709 NotifyJobAdded(job->job_info); |
708 DoJobLoop(GetJobQueueType(job->job_info.job_type)); | 710 DoJobLoop(GetJobQueueType(job->job_info.job_type)); |
709 } | 711 } |
710 | 712 |
711 void JobScheduler::QueueJob(JobID job_id) { | 713 void JobScheduler::QueueJob(JobID job_id) { |
712 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 714 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
713 | 715 |
714 JobEntry* job_entry = job_map_.Lookup(job_id); | 716 JobEntry* job_entry = job_map_.Lookup(job_id); |
715 DCHECK(job_entry); | 717 DCHECK(job_entry); |
716 const JobInfo& job_info = job_entry->job_info; | 718 const JobInfo& job_info = job_entry->job_info; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 JobID job_id = -1; | 761 JobID job_id = -1; |
760 if (!queue_[queue_type]->PopForRun(accepted_priority, &job_id)) | 762 if (!queue_[queue_type]->PopForRun(accepted_priority, &job_id)) |
761 return; | 763 return; |
762 | 764 |
763 JobEntry* entry = job_map_.Lookup(job_id); | 765 JobEntry* entry = job_map_.Lookup(job_id); |
764 DCHECK(entry); | 766 DCHECK(entry); |
765 | 767 |
766 JobInfo* job_info = &entry->job_info; | 768 JobInfo* job_info = &entry->job_info; |
767 job_info->state = STATE_RUNNING; | 769 job_info->state = STATE_RUNNING; |
768 job_info->start_time = now; | 770 job_info->start_time = now; |
| 771 job_info->num_total_jobs = queue_[queue_type]->GetNumberOfJobs(); |
769 NotifyJobUpdated(*job_info); | 772 NotifyJobUpdated(*job_info); |
770 | 773 |
771 entry->cancel_callback = entry->task.Run(); | 774 entry->cancel_callback = entry->task.Run(); |
772 | 775 |
773 UpdateWait(); | 776 UpdateWait(); |
774 | 777 |
775 logger_->Log(logging::LOG_INFO, | 778 logger_->Log(logging::LOG_INFO, |
776 "Job started: %s - %s", | 779 "Job started: %s - %s", |
777 job_info->ToString().c_str(), | 780 job_info->ToString().c_str(), |
778 GetQueueInfo(queue_type).c_str()); | 781 GetQueueInfo(queue_type).c_str()); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 UpdateWait(); | 849 UpdateWait(); |
847 } else { | 850 } else { |
848 throttle_count_ = 0; | 851 throttle_count_ = 0; |
849 } | 852 } |
850 | 853 |
851 const bool should_retry = | 854 const bool should_retry = |
852 is_server_error && job_entry->retry_count < kMaxRetryCount; | 855 is_server_error && job_entry->retry_count < kMaxRetryCount; |
853 if (should_retry) { | 856 if (should_retry) { |
854 job_entry->cancel_callback.Reset(); | 857 job_entry->cancel_callback.Reset(); |
855 job_info->state = STATE_RETRY; | 858 job_info->state = STATE_RETRY; |
| 859 QueueType queue_type = GetJobQueueType(job_info->job_type); |
| 860 job_info->num_total_jobs = queue_[queue_type]->GetNumberOfJobs(); |
856 NotifyJobUpdated(*job_info); | 861 NotifyJobUpdated(*job_info); |
857 | 862 |
858 ++job_entry->retry_count; | 863 ++job_entry->retry_count; |
859 | 864 |
860 // Requeue the job. | 865 // Requeue the job. |
861 QueueJob(job_id); | 866 QueueJob(job_id); |
862 } else { | 867 } else { |
| 868 QueueType queue_type = GetJobQueueType(job_info->job_type); |
| 869 job_info->num_total_jobs = queue_[queue_type]->GetNumberOfJobs(); |
863 NotifyJobDone(*job_info, error); | 870 NotifyJobDone(*job_info, error); |
864 // The job has finished, no retry will happen in the scheduler. Now we can | 871 // The job has finished, no retry will happen in the scheduler. Now we can |
865 // remove the job info from the map. | 872 // remove the job info from the map. |
866 job_map_.Remove(job_id); | 873 job_map_.Remove(job_id); |
867 } | 874 } |
868 | 875 |
869 // Post a task to continue the job loop. This allows us to finish handling | 876 // Post a task to continue the job loop. This allows us to finish handling |
870 // the current job before starting the next one. | 877 // the current job before starting the next one. |
871 base::MessageLoopProxy::current()->PostTask(FROM_HERE, | 878 base::MessageLoopProxy::current()->PostTask(FROM_HERE, |
872 base::Bind(&JobScheduler::DoJobLoop, | 879 base::Bind(&JobScheduler::DoJobLoop, |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1030 callback.Run(error, entry.Pass()); | 1037 callback.Run(error, entry.Pass()); |
1031 } | 1038 } |
1032 | 1039 |
1033 void JobScheduler::UpdateProgress(JobID job_id, int64 progress, int64 total) { | 1040 void JobScheduler::UpdateProgress(JobID job_id, int64 progress, int64 total) { |
1034 JobEntry* job_entry = job_map_.Lookup(job_id); | 1041 JobEntry* job_entry = job_map_.Lookup(job_id); |
1035 DCHECK(job_entry); | 1042 DCHECK(job_entry); |
1036 | 1043 |
1037 job_entry->job_info.num_completed_bytes = progress; | 1044 job_entry->job_info.num_completed_bytes = progress; |
1038 if (total != -1) | 1045 if (total != -1) |
1039 job_entry->job_info.num_total_bytes = total; | 1046 job_entry->job_info.num_total_bytes = total; |
| 1047 QueueType queue_type = GetJobQueueType(job_entry->job_info.job_type); |
| 1048 job_entry->job_info.num_total_jobs = queue_[queue_type]->GetNumberOfJobs(); |
1040 NotifyJobUpdated(job_entry->job_info); | 1049 NotifyJobUpdated(job_entry->job_info); |
1041 } | 1050 } |
1042 | 1051 |
1043 void JobScheduler::OnConnectionTypeChanged( | 1052 void JobScheduler::OnConnectionTypeChanged( |
1044 net::NetworkChangeNotifier::ConnectionType type) { | 1053 net::NetworkChangeNotifier::ConnectionType type) { |
1045 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1054 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1046 | 1055 |
1047 // Resume the job loop. | 1056 // Resume the job loop. |
1048 // Note that we don't need to check the network connection status as it will | 1057 // Note that we don't need to check the network connection status as it will |
1049 // be checked in GetCurrentAcceptedPriority(). | 1058 // be checked in GetCurrentAcceptedPriority(). |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 logger_->Log(logging::LOG_INFO, | 1100 logger_->Log(logging::LOG_INFO, |
1092 "Job aborted: %s => %s (elapsed time: %sms) - %s", | 1101 "Job aborted: %s => %s (elapsed time: %sms) - %s", |
1093 job->job_info.ToString().c_str(), | 1102 job->job_info.ToString().c_str(), |
1094 GDataErrorCodeToString(error).c_str(), | 1103 GDataErrorCodeToString(error).c_str(), |
1095 base::Int64ToString(elapsed.InMilliseconds()).c_str(), | 1104 base::Int64ToString(elapsed.InMilliseconds()).c_str(), |
1096 GetQueueInfo(queue_type).c_str()); | 1105 GetQueueInfo(queue_type).c_str()); |
1097 | 1106 |
1098 base::Callback<void(google_apis::GDataErrorCode)> callback = | 1107 base::Callback<void(google_apis::GDataErrorCode)> callback = |
1099 job->abort_callback; | 1108 job->abort_callback; |
1100 queue_[GetJobQueueType(job->job_info.job_type)]->Remove(job->job_info.job_id); | 1109 queue_[GetJobQueueType(job->job_info.job_type)]->Remove(job->job_info.job_id); |
| 1110 job->job_info.num_total_jobs = queue_[queue_type]->GetNumberOfJobs(); |
1101 NotifyJobDone(job->job_info, error); | 1111 NotifyJobDone(job->job_info, error); |
1102 job_map_.Remove(job->job_info.job_id); | 1112 job_map_.Remove(job->job_info.job_id); |
1103 base::MessageLoopProxy::current()->PostTask(FROM_HERE, | 1113 base::MessageLoopProxy::current()->PostTask(FROM_HERE, |
1104 base::Bind(callback, error)); | 1114 base::Bind(callback, error)); |
1105 } | 1115 } |
1106 | 1116 |
1107 void JobScheduler::NotifyJobAdded(const JobInfo& job_info) { | 1117 void JobScheduler::NotifyJobAdded(const JobInfo& job_info) { |
1108 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1118 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1109 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobAdded(job_info)); | 1119 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobAdded(job_info)); |
1110 } | 1120 } |
(...skipping 22 matching lines...) Expand all Loading... |
1133 case FILE_QUEUE: | 1143 case FILE_QUEUE: |
1134 return "FILE_QUEUE"; | 1144 return "FILE_QUEUE"; |
1135 case NUM_QUEUES: | 1145 case NUM_QUEUES: |
1136 break; // This value is just a sentinel. Should never be used. | 1146 break; // This value is just a sentinel. Should never be used. |
1137 } | 1147 } |
1138 NOTREACHED(); | 1148 NOTREACHED(); |
1139 return ""; | 1149 return ""; |
1140 } | 1150 } |
1141 | 1151 |
1142 } // namespace drive | 1152 } // namespace drive |
OLD | NEW |