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

Side by Side Diff: chrome/browser/chromeos/drive/job_scheduler.cc

Issue 1036723003: favor DCHECK_CURRENTLY_ON for better logs in chrome/browser/chromeos/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 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 (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/files/file_util.h" 7 #include "base/files/file_util.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/prefs/pref_service.h" 10 #include "base/prefs/pref_service.h"
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 // Metadata jobs are cheap, so we run them concurrently. File jobs run serially. 164 // Metadata jobs are cheap, so we run them concurrently. File jobs run serially.
165 const int JobScheduler::kMaxJobCount[] = { 165 const int JobScheduler::kMaxJobCount[] = {
166 5, // METADATA_QUEUE 166 5, // METADATA_QUEUE
167 1, // FILE_QUEUE 167 1, // FILE_QUEUE
168 }; 168 };
169 169
170 JobScheduler::JobEntry::JobEntry(JobType type) 170 JobScheduler::JobEntry::JobEntry(JobType type)
171 : job_info(type), 171 : job_info(type),
172 context(ClientContext(USER_INITIATED)), 172 context(ClientContext(USER_INITIATED)),
173 retry_count(0) { 173 retry_count(0) {
174 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 174 DCHECK_CURRENTLY_ON(BrowserThread::UI);
175 } 175 }
176 176
177 JobScheduler::JobEntry::~JobEntry() { 177 JobScheduler::JobEntry::~JobEntry() {
178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 178 DCHECK_CURRENTLY_ON(BrowserThread::UI);
179 } 179 }
180 180
181 struct JobScheduler::ResumeUploadParams { 181 struct JobScheduler::ResumeUploadParams {
182 base::FilePath drive_file_path; 182 base::FilePath drive_file_path;
183 base::FilePath local_file_path; 183 base::FilePath local_file_path;
184 std::string content_type; 184 std::string content_type;
185 }; 185 };
186 186
187 JobScheduler::JobScheduler(PrefService* pref_service, 187 JobScheduler::JobScheduler(PrefService* pref_service,
188 EventLogger* logger, 188 EventLogger* logger,
189 DriveServiceInterface* drive_service, 189 DriveServiceInterface* drive_service,
190 base::SequencedTaskRunner* blocking_task_runner) 190 base::SequencedTaskRunner* blocking_task_runner)
191 : throttle_count_(0), 191 : throttle_count_(0),
192 wait_until_(base::Time::Now()), 192 wait_until_(base::Time::Now()),
193 disable_throttling_(false), 193 disable_throttling_(false),
194 logger_(logger), 194 logger_(logger),
195 drive_service_(drive_service), 195 drive_service_(drive_service),
196 blocking_task_runner_(blocking_task_runner), 196 blocking_task_runner_(blocking_task_runner),
197 uploader_(new DriveUploader(drive_service, blocking_task_runner)), 197 uploader_(new DriveUploader(drive_service, blocking_task_runner)),
198 pref_service_(pref_service), 198 pref_service_(pref_service),
199 weak_ptr_factory_(this) { 199 weak_ptr_factory_(this) {
200 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 200 DCHECK_CURRENTLY_ON(BrowserThread::UI);
201 201
202 for (int i = 0; i < NUM_QUEUES; ++i) 202 for (int i = 0; i < NUM_QUEUES; ++i)
203 queue_[i].reset(new JobQueue(kMaxJobCount[i], NUM_CONTEXT_TYPES)); 203 queue_[i].reset(new JobQueue(kMaxJobCount[i], NUM_CONTEXT_TYPES));
204 204
205 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); 205 net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
206 } 206 }
207 207
208 JobScheduler::~JobScheduler() { 208 JobScheduler::~JobScheduler() {
209 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 209 DCHECK_CURRENTLY_ON(BrowserThread::UI);
210 210
211 size_t num_queued_jobs = 0; 211 size_t num_queued_jobs = 0;
212 for (int i = 0; i < NUM_QUEUES; ++i) 212 for (int i = 0; i < NUM_QUEUES; ++i)
213 num_queued_jobs += queue_[i]->GetNumberOfJobs(); 213 num_queued_jobs += queue_[i]->GetNumberOfJobs();
214 DCHECK_EQ(num_queued_jobs, job_map_.size()); 214 DCHECK_EQ(num_queued_jobs, job_map_.size());
215 215
216 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); 216 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
217 } 217 }
218 218
219 std::vector<JobInfo> JobScheduler::GetJobInfoList() { 219 std::vector<JobInfo> JobScheduler::GetJobInfoList() {
220 std::vector<JobInfo> job_info_list; 220 std::vector<JobInfo> job_info_list;
221 for (JobIDMap::iterator iter(&job_map_); !iter.IsAtEnd(); iter.Advance()) 221 for (JobIDMap::iterator iter(&job_map_); !iter.IsAtEnd(); iter.Advance())
222 job_info_list.push_back(iter.GetCurrentValue()->job_info); 222 job_info_list.push_back(iter.GetCurrentValue()->job_info);
223 return job_info_list; 223 return job_info_list;
224 } 224 }
225 225
226 void JobScheduler::AddObserver(JobListObserver* observer) { 226 void JobScheduler::AddObserver(JobListObserver* observer) {
227 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 227 DCHECK_CURRENTLY_ON(BrowserThread::UI);
228 observer_list_.AddObserver(observer); 228 observer_list_.AddObserver(observer);
229 } 229 }
230 230
231 void JobScheduler::RemoveObserver(JobListObserver* observer) { 231 void JobScheduler::RemoveObserver(JobListObserver* observer) {
232 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 232 DCHECK_CURRENTLY_ON(BrowserThread::UI);
233 observer_list_.RemoveObserver(observer); 233 observer_list_.RemoveObserver(observer);
234 } 234 }
235 235
236 void JobScheduler::CancelJob(JobID job_id) { 236 void JobScheduler::CancelJob(JobID job_id) {
237 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 237 DCHECK_CURRENTLY_ON(BrowserThread::UI);
238 238
239 JobEntry* job = job_map_.Lookup(job_id); 239 JobEntry* job = job_map_.Lookup(job_id);
240 if (job) { 240 if (job) {
241 if (job->job_info.state == STATE_RUNNING) { 241 if (job->job_info.state == STATE_RUNNING) {
242 // If the job is running an HTTP request, cancel it via |cancel_callback| 242 // If the job is running an HTTP request, cancel it via |cancel_callback|
243 // returned from the request, and wait for termination in the normal 243 // returned from the request, and wait for termination in the normal
244 // callback handler, OnJobDone. 244 // callback handler, OnJobDone.
245 if (!job->cancel_callback.is_null()) 245 if (!job->cancel_callback.is_null())
246 job->cancel_callback.Run(); 246 job->cancel_callback.Run();
247 } else { 247 } else {
248 AbortNotRunningJob(job, google_apis::DRIVE_CANCELLED); 248 AbortNotRunningJob(job, google_apis::DRIVE_CANCELLED);
249 } 249 }
250 } 250 }
251 } 251 }
252 252
253 void JobScheduler::CancelAllJobs() { 253 void JobScheduler::CancelAllJobs() {
254 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 254 DCHECK_CURRENTLY_ON(BrowserThread::UI);
255 255
256 // CancelJob may remove the entry from |job_map_|. That's OK. IDMap supports 256 // CancelJob may remove the entry from |job_map_|. That's OK. IDMap supports
257 // removable during iteration. 257 // removable during iteration.
258 for (JobIDMap::iterator iter(&job_map_); !iter.IsAtEnd(); iter.Advance()) 258 for (JobIDMap::iterator iter(&job_map_); !iter.IsAtEnd(); iter.Advance())
259 CancelJob(iter.GetCurrentKey()); 259 CancelJob(iter.GetCurrentKey());
260 } 260 }
261 261
262 void JobScheduler::GetAboutResource( 262 void JobScheduler::GetAboutResource(
263 const google_apis::AboutResourceCallback& callback) { 263 const google_apis::AboutResourceCallback& callback) {
264 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 264 DCHECK_CURRENTLY_ON(BrowserThread::UI);
265 DCHECK(!callback.is_null()); 265 DCHECK(!callback.is_null());
266 266
267 JobEntry* new_job = CreateNewJob(TYPE_GET_ABOUT_RESOURCE); 267 JobEntry* new_job = CreateNewJob(TYPE_GET_ABOUT_RESOURCE);
268 new_job->task = base::Bind( 268 new_job->task = base::Bind(
269 &DriveServiceInterface::GetAboutResource, 269 &DriveServiceInterface::GetAboutResource,
270 base::Unretained(drive_service_), 270 base::Unretained(drive_service_),
271 base::Bind(&JobScheduler::OnGetAboutResourceJobDone, 271 base::Bind(&JobScheduler::OnGetAboutResourceJobDone,
272 weak_ptr_factory_.GetWeakPtr(), 272 weak_ptr_factory_.GetWeakPtr(),
273 new_job->job_info.job_id, 273 new_job->job_info.job_id,
274 callback)); 274 callback));
275 new_job->abort_callback = CreateErrorRunCallback(callback); 275 new_job->abort_callback = CreateErrorRunCallback(callback);
276 StartJob(new_job); 276 StartJob(new_job);
277 } 277 }
278 278
279 void JobScheduler::GetAppList(const google_apis::AppListCallback& callback) { 279 void JobScheduler::GetAppList(const google_apis::AppListCallback& callback) {
280 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 280 DCHECK_CURRENTLY_ON(BrowserThread::UI);
281 DCHECK(!callback.is_null()); 281 DCHECK(!callback.is_null());
282 282
283 JobEntry* new_job = CreateNewJob(TYPE_GET_APP_LIST); 283 JobEntry* new_job = CreateNewJob(TYPE_GET_APP_LIST);
284 new_job->task = base::Bind( 284 new_job->task = base::Bind(
285 &DriveServiceInterface::GetAppList, 285 &DriveServiceInterface::GetAppList,
286 base::Unretained(drive_service_), 286 base::Unretained(drive_service_),
287 base::Bind(&JobScheduler::OnGetAppListJobDone, 287 base::Bind(&JobScheduler::OnGetAppListJobDone,
288 weak_ptr_factory_.GetWeakPtr(), 288 weak_ptr_factory_.GetWeakPtr(),
289 new_job->job_info.job_id, 289 new_job->job_info.job_id,
290 callback)); 290 callback));
291 new_job->abort_callback = CreateErrorRunCallback(callback); 291 new_job->abort_callback = CreateErrorRunCallback(callback);
292 StartJob(new_job); 292 StartJob(new_job);
293 } 293 }
294 294
295 void JobScheduler::GetAllFileList( 295 void JobScheduler::GetAllFileList(
296 const google_apis::FileListCallback& callback) { 296 const google_apis::FileListCallback& callback) {
297 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 297 DCHECK_CURRENTLY_ON(BrowserThread::UI);
298 DCHECK(!callback.is_null()); 298 DCHECK(!callback.is_null());
299 299
300 JobEntry* new_job = CreateNewJob(TYPE_GET_ALL_RESOURCE_LIST); 300 JobEntry* new_job = CreateNewJob(TYPE_GET_ALL_RESOURCE_LIST);
301 new_job->task = base::Bind( 301 new_job->task = base::Bind(
302 &DriveServiceInterface::GetAllFileList, 302 &DriveServiceInterface::GetAllFileList,
303 base::Unretained(drive_service_), 303 base::Unretained(drive_service_),
304 base::Bind(&JobScheduler::OnGetFileListJobDone, 304 base::Bind(&JobScheduler::OnGetFileListJobDone,
305 weak_ptr_factory_.GetWeakPtr(), 305 weak_ptr_factory_.GetWeakPtr(),
306 new_job->job_info.job_id, 306 new_job->job_info.job_id,
307 callback)); 307 callback));
308 new_job->abort_callback = CreateErrorRunCallback(callback); 308 new_job->abort_callback = CreateErrorRunCallback(callback);
309 StartJob(new_job); 309 StartJob(new_job);
310 } 310 }
311 311
312 void JobScheduler::GetFileListInDirectory( 312 void JobScheduler::GetFileListInDirectory(
313 const std::string& directory_resource_id, 313 const std::string& directory_resource_id,
314 const google_apis::FileListCallback& callback) { 314 const google_apis::FileListCallback& callback) {
315 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 315 DCHECK_CURRENTLY_ON(BrowserThread::UI);
316 DCHECK(!callback.is_null()); 316 DCHECK(!callback.is_null());
317 317
318 JobEntry* new_job = CreateNewJob( 318 JobEntry* new_job = CreateNewJob(
319 TYPE_GET_RESOURCE_LIST_IN_DIRECTORY); 319 TYPE_GET_RESOURCE_LIST_IN_DIRECTORY);
320 new_job->task = base::Bind( 320 new_job->task = base::Bind(
321 &DriveServiceInterface::GetFileListInDirectory, 321 &DriveServiceInterface::GetFileListInDirectory,
322 base::Unretained(drive_service_), 322 base::Unretained(drive_service_),
323 directory_resource_id, 323 directory_resource_id,
324 base::Bind(&JobScheduler::OnGetFileListJobDone, 324 base::Bind(&JobScheduler::OnGetFileListJobDone,
325 weak_ptr_factory_.GetWeakPtr(), 325 weak_ptr_factory_.GetWeakPtr(),
326 new_job->job_info.job_id, 326 new_job->job_info.job_id,
327 callback)); 327 callback));
328 new_job->abort_callback = CreateErrorRunCallback(callback); 328 new_job->abort_callback = CreateErrorRunCallback(callback);
329 StartJob(new_job); 329 StartJob(new_job);
330 } 330 }
331 331
332 void JobScheduler::Search(const std::string& search_query, 332 void JobScheduler::Search(const std::string& search_query,
333 const google_apis::FileListCallback& callback) { 333 const google_apis::FileListCallback& callback) {
334 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 334 DCHECK_CURRENTLY_ON(BrowserThread::UI);
335 DCHECK(!callback.is_null()); 335 DCHECK(!callback.is_null());
336 336
337 JobEntry* new_job = CreateNewJob(TYPE_SEARCH); 337 JobEntry* new_job = CreateNewJob(TYPE_SEARCH);
338 new_job->task = base::Bind( 338 new_job->task = base::Bind(
339 &DriveServiceInterface::Search, 339 &DriveServiceInterface::Search,
340 base::Unretained(drive_service_), 340 base::Unretained(drive_service_),
341 search_query, 341 search_query,
342 base::Bind(&JobScheduler::OnGetFileListJobDone, 342 base::Bind(&JobScheduler::OnGetFileListJobDone,
343 weak_ptr_factory_.GetWeakPtr(), 343 weak_ptr_factory_.GetWeakPtr(),
344 new_job->job_info.job_id, 344 new_job->job_info.job_id,
345 callback)); 345 callback));
346 new_job->abort_callback = CreateErrorRunCallback(callback); 346 new_job->abort_callback = CreateErrorRunCallback(callback);
347 StartJob(new_job); 347 StartJob(new_job);
348 } 348 }
349 349
350 void JobScheduler::GetChangeList( 350 void JobScheduler::GetChangeList(
351 int64 start_changestamp, 351 int64 start_changestamp,
352 const google_apis::ChangeListCallback& callback) { 352 const google_apis::ChangeListCallback& callback) {
353 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 353 DCHECK_CURRENTLY_ON(BrowserThread::UI);
354 DCHECK(!callback.is_null()); 354 DCHECK(!callback.is_null());
355 355
356 JobEntry* new_job = CreateNewJob(TYPE_GET_CHANGE_LIST); 356 JobEntry* new_job = CreateNewJob(TYPE_GET_CHANGE_LIST);
357 new_job->task = base::Bind( 357 new_job->task = base::Bind(
358 &DriveServiceInterface::GetChangeList, 358 &DriveServiceInterface::GetChangeList,
359 base::Unretained(drive_service_), 359 base::Unretained(drive_service_),
360 start_changestamp, 360 start_changestamp,
361 base::Bind(&JobScheduler::OnGetChangeListJobDone, 361 base::Bind(&JobScheduler::OnGetChangeListJobDone,
362 weak_ptr_factory_.GetWeakPtr(), 362 weak_ptr_factory_.GetWeakPtr(),
363 new_job->job_info.job_id, 363 new_job->job_info.job_id,
364 callback)); 364 callback));
365 new_job->abort_callback = CreateErrorRunCallback(callback); 365 new_job->abort_callback = CreateErrorRunCallback(callback);
366 StartJob(new_job); 366 StartJob(new_job);
367 } 367 }
368 368
369 void JobScheduler::GetRemainingChangeList( 369 void JobScheduler::GetRemainingChangeList(
370 const GURL& next_link, 370 const GURL& next_link,
371 const google_apis::ChangeListCallback& callback) { 371 const google_apis::ChangeListCallback& callback) {
372 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 372 DCHECK_CURRENTLY_ON(BrowserThread::UI);
373 DCHECK(!callback.is_null()); 373 DCHECK(!callback.is_null());
374 374
375 JobEntry* new_job = CreateNewJob(TYPE_GET_REMAINING_CHANGE_LIST); 375 JobEntry* new_job = CreateNewJob(TYPE_GET_REMAINING_CHANGE_LIST);
376 new_job->task = base::Bind( 376 new_job->task = base::Bind(
377 &DriveServiceInterface::GetRemainingChangeList, 377 &DriveServiceInterface::GetRemainingChangeList,
378 base::Unretained(drive_service_), 378 base::Unretained(drive_service_),
379 next_link, 379 next_link,
380 base::Bind(&JobScheduler::OnGetChangeListJobDone, 380 base::Bind(&JobScheduler::OnGetChangeListJobDone,
381 weak_ptr_factory_.GetWeakPtr(), 381 weak_ptr_factory_.GetWeakPtr(),
382 new_job->job_info.job_id, 382 new_job->job_info.job_id,
383 callback)); 383 callback));
384 new_job->abort_callback = CreateErrorRunCallback(callback); 384 new_job->abort_callback = CreateErrorRunCallback(callback);
385 StartJob(new_job); 385 StartJob(new_job);
386 } 386 }
387 387
388 void JobScheduler::GetRemainingFileList( 388 void JobScheduler::GetRemainingFileList(
389 const GURL& next_link, 389 const GURL& next_link,
390 const google_apis::FileListCallback& callback) { 390 const google_apis::FileListCallback& callback) {
391 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 391 DCHECK_CURRENTLY_ON(BrowserThread::UI);
392 DCHECK(!callback.is_null()); 392 DCHECK(!callback.is_null());
393 393
394 JobEntry* new_job = CreateNewJob(TYPE_GET_REMAINING_FILE_LIST); 394 JobEntry* new_job = CreateNewJob(TYPE_GET_REMAINING_FILE_LIST);
395 new_job->task = base::Bind( 395 new_job->task = base::Bind(
396 &DriveServiceInterface::GetRemainingFileList, 396 &DriveServiceInterface::GetRemainingFileList,
397 base::Unretained(drive_service_), 397 base::Unretained(drive_service_),
398 next_link, 398 next_link,
399 base::Bind(&JobScheduler::OnGetFileListJobDone, 399 base::Bind(&JobScheduler::OnGetFileListJobDone,
400 weak_ptr_factory_.GetWeakPtr(), 400 weak_ptr_factory_.GetWeakPtr(),
401 new_job->job_info.job_id, 401 new_job->job_info.job_id,
402 callback)); 402 callback));
403 new_job->abort_callback = CreateErrorRunCallback(callback); 403 new_job->abort_callback = CreateErrorRunCallback(callback);
404 StartJob(new_job); 404 StartJob(new_job);
405 } 405 }
406 406
407 void JobScheduler::GetFileResource( 407 void JobScheduler::GetFileResource(
408 const std::string& resource_id, 408 const std::string& resource_id,
409 const ClientContext& context, 409 const ClientContext& context,
410 const google_apis::FileResourceCallback& callback) { 410 const google_apis::FileResourceCallback& callback) {
411 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 411 DCHECK_CURRENTLY_ON(BrowserThread::UI);
412 DCHECK(!callback.is_null()); 412 DCHECK(!callback.is_null());
413 413
414 JobEntry* new_job = CreateNewJob(TYPE_GET_RESOURCE_ENTRY); 414 JobEntry* new_job = CreateNewJob(TYPE_GET_RESOURCE_ENTRY);
415 new_job->context = context; 415 new_job->context = context;
416 new_job->task = base::Bind( 416 new_job->task = base::Bind(
417 &DriveServiceInterface::GetFileResource, 417 &DriveServiceInterface::GetFileResource,
418 base::Unretained(drive_service_), 418 base::Unretained(drive_service_),
419 resource_id, 419 resource_id,
420 base::Bind(&JobScheduler::OnGetFileResourceJobDone, 420 base::Bind(&JobScheduler::OnGetFileResourceJobDone,
421 weak_ptr_factory_.GetWeakPtr(), 421 weak_ptr_factory_.GetWeakPtr(),
422 new_job->job_info.job_id, 422 new_job->job_info.job_id,
423 callback)); 423 callback));
424 new_job->abort_callback = CreateErrorRunCallback(callback); 424 new_job->abort_callback = CreateErrorRunCallback(callback);
425 StartJob(new_job); 425 StartJob(new_job);
426 } 426 }
427 427
428 void JobScheduler::GetShareUrl( 428 void JobScheduler::GetShareUrl(
429 const std::string& resource_id, 429 const std::string& resource_id,
430 const GURL& embed_origin, 430 const GURL& embed_origin,
431 const ClientContext& context, 431 const ClientContext& context,
432 const google_apis::GetShareUrlCallback& callback) { 432 const google_apis::GetShareUrlCallback& callback) {
433 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 433 DCHECK_CURRENTLY_ON(BrowserThread::UI);
434 DCHECK(!callback.is_null()); 434 DCHECK(!callback.is_null());
435 435
436 JobEntry* new_job = CreateNewJob(TYPE_GET_SHARE_URL); 436 JobEntry* new_job = CreateNewJob(TYPE_GET_SHARE_URL);
437 new_job->context = context; 437 new_job->context = context;
438 new_job->task = base::Bind( 438 new_job->task = base::Bind(
439 &DriveServiceInterface::GetShareUrl, 439 &DriveServiceInterface::GetShareUrl,
440 base::Unretained(drive_service_), 440 base::Unretained(drive_service_),
441 resource_id, 441 resource_id,
442 embed_origin, 442 embed_origin,
443 base::Bind(&JobScheduler::OnGetShareUrlJobDone, 443 base::Bind(&JobScheduler::OnGetShareUrlJobDone,
444 weak_ptr_factory_.GetWeakPtr(), 444 weak_ptr_factory_.GetWeakPtr(),
445 new_job->job_info.job_id, 445 new_job->job_info.job_id,
446 callback)); 446 callback));
447 new_job->abort_callback = CreateErrorRunCallback(callback); 447 new_job->abort_callback = CreateErrorRunCallback(callback);
448 StartJob(new_job); 448 StartJob(new_job);
449 } 449 }
450 450
451 void JobScheduler::TrashResource( 451 void JobScheduler::TrashResource(
452 const std::string& resource_id, 452 const std::string& resource_id,
453 const ClientContext& context, 453 const ClientContext& context,
454 const google_apis::EntryActionCallback& callback) { 454 const google_apis::EntryActionCallback& callback) {
455 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 455 DCHECK_CURRENTLY_ON(BrowserThread::UI);
456 DCHECK(!callback.is_null()); 456 DCHECK(!callback.is_null());
457 457
458 JobEntry* new_job = CreateNewJob(TYPE_TRASH_RESOURCE); 458 JobEntry* new_job = CreateNewJob(TYPE_TRASH_RESOURCE);
459 new_job->context = context; 459 new_job->context = context;
460 new_job->task = base::Bind( 460 new_job->task = base::Bind(
461 &DriveServiceInterface::TrashResource, 461 &DriveServiceInterface::TrashResource,
462 base::Unretained(drive_service_), 462 base::Unretained(drive_service_),
463 resource_id, 463 resource_id,
464 base::Bind(&JobScheduler::OnEntryActionJobDone, 464 base::Bind(&JobScheduler::OnEntryActionJobDone,
465 weak_ptr_factory_.GetWeakPtr(), 465 weak_ptr_factory_.GetWeakPtr(),
466 new_job->job_info.job_id, 466 new_job->job_info.job_id,
467 callback)); 467 callback));
468 new_job->abort_callback = callback; 468 new_job->abort_callback = callback;
469 StartJob(new_job); 469 StartJob(new_job);
470 } 470 }
471 471
472 void JobScheduler::CopyResource( 472 void JobScheduler::CopyResource(
473 const std::string& resource_id, 473 const std::string& resource_id,
474 const std::string& parent_resource_id, 474 const std::string& parent_resource_id,
475 const std::string& new_title, 475 const std::string& new_title,
476 const base::Time& last_modified, 476 const base::Time& last_modified,
477 const google_apis::FileResourceCallback& callback) { 477 const google_apis::FileResourceCallback& callback) {
478 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 478 DCHECK_CURRENTLY_ON(BrowserThread::UI);
479 DCHECK(!callback.is_null()); 479 DCHECK(!callback.is_null());
480 480
481 JobEntry* new_job = CreateNewJob(TYPE_COPY_RESOURCE); 481 JobEntry* new_job = CreateNewJob(TYPE_COPY_RESOURCE);
482 new_job->task = base::Bind( 482 new_job->task = base::Bind(
483 &DriveServiceInterface::CopyResource, 483 &DriveServiceInterface::CopyResource,
484 base::Unretained(drive_service_), 484 base::Unretained(drive_service_),
485 resource_id, 485 resource_id,
486 parent_resource_id, 486 parent_resource_id,
487 new_title, 487 new_title,
488 last_modified, 488 last_modified,
489 base::Bind(&JobScheduler::OnGetFileResourceJobDone, 489 base::Bind(&JobScheduler::OnGetFileResourceJobDone,
490 weak_ptr_factory_.GetWeakPtr(), 490 weak_ptr_factory_.GetWeakPtr(),
491 new_job->job_info.job_id, 491 new_job->job_info.job_id,
492 callback)); 492 callback));
493 new_job->abort_callback = CreateErrorRunCallback(callback); 493 new_job->abort_callback = CreateErrorRunCallback(callback);
494 StartJob(new_job); 494 StartJob(new_job);
495 } 495 }
496 496
497 void JobScheduler::UpdateResource( 497 void JobScheduler::UpdateResource(
498 const std::string& resource_id, 498 const std::string& resource_id,
499 const std::string& parent_resource_id, 499 const std::string& parent_resource_id,
500 const std::string& new_title, 500 const std::string& new_title,
501 const base::Time& last_modified, 501 const base::Time& last_modified,
502 const base::Time& last_viewed_by_me, 502 const base::Time& last_viewed_by_me,
503 const google_apis::drive::Properties& properties, 503 const google_apis::drive::Properties& properties,
504 const ClientContext& context, 504 const ClientContext& context,
505 const google_apis::FileResourceCallback& callback) { 505 const google_apis::FileResourceCallback& callback) {
506 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 506 DCHECK_CURRENTLY_ON(BrowserThread::UI);
507 DCHECK(!callback.is_null()); 507 DCHECK(!callback.is_null());
508 508
509 JobEntry* new_job = CreateNewJob(TYPE_UPDATE_RESOURCE); 509 JobEntry* new_job = CreateNewJob(TYPE_UPDATE_RESOURCE);
510 new_job->context = context; 510 new_job->context = context;
511 new_job->task = base::Bind(&DriveServiceInterface::UpdateResource, 511 new_job->task = base::Bind(&DriveServiceInterface::UpdateResource,
512 base::Unretained(drive_service_), resource_id, 512 base::Unretained(drive_service_), resource_id,
513 parent_resource_id, new_title, last_modified, 513 parent_resource_id, new_title, last_modified,
514 last_viewed_by_me, properties, 514 last_viewed_by_me, properties,
515 base::Bind(&JobScheduler::OnGetFileResourceJobDone, 515 base::Bind(&JobScheduler::OnGetFileResourceJobDone,
516 weak_ptr_factory_.GetWeakPtr(), 516 weak_ptr_factory_.GetWeakPtr(),
517 new_job->job_info.job_id, callback)); 517 new_job->job_info.job_id, callback));
518 new_job->abort_callback = CreateErrorRunCallback(callback); 518 new_job->abort_callback = CreateErrorRunCallback(callback);
519 StartJob(new_job); 519 StartJob(new_job);
520 } 520 }
521 521
522 void JobScheduler::AddResourceToDirectory( 522 void JobScheduler::AddResourceToDirectory(
523 const std::string& parent_resource_id, 523 const std::string& parent_resource_id,
524 const std::string& resource_id, 524 const std::string& resource_id,
525 const google_apis::EntryActionCallback& callback) { 525 const google_apis::EntryActionCallback& callback) {
526 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 526 DCHECK_CURRENTLY_ON(BrowserThread::UI);
527 DCHECK(!callback.is_null()); 527 DCHECK(!callback.is_null());
528 528
529 JobEntry* new_job = CreateNewJob(TYPE_ADD_RESOURCE_TO_DIRECTORY); 529 JobEntry* new_job = CreateNewJob(TYPE_ADD_RESOURCE_TO_DIRECTORY);
530 new_job->task = base::Bind( 530 new_job->task = base::Bind(
531 &DriveServiceInterface::AddResourceToDirectory, 531 &DriveServiceInterface::AddResourceToDirectory,
532 base::Unretained(drive_service_), 532 base::Unretained(drive_service_),
533 parent_resource_id, 533 parent_resource_id,
534 resource_id, 534 resource_id,
535 base::Bind(&JobScheduler::OnEntryActionJobDone, 535 base::Bind(&JobScheduler::OnEntryActionJobDone,
536 weak_ptr_factory_.GetWeakPtr(), 536 weak_ptr_factory_.GetWeakPtr(),
537 new_job->job_info.job_id, 537 new_job->job_info.job_id,
538 callback)); 538 callback));
539 new_job->abort_callback = callback; 539 new_job->abort_callback = callback;
540 StartJob(new_job); 540 StartJob(new_job);
541 } 541 }
542 542
543 void JobScheduler::RemoveResourceFromDirectory( 543 void JobScheduler::RemoveResourceFromDirectory(
544 const std::string& parent_resource_id, 544 const std::string& parent_resource_id,
545 const std::string& resource_id, 545 const std::string& resource_id,
546 const ClientContext& context, 546 const ClientContext& context,
547 const google_apis::EntryActionCallback& callback) { 547 const google_apis::EntryActionCallback& callback) {
548 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 548 DCHECK_CURRENTLY_ON(BrowserThread::UI);
549 549
550 JobEntry* new_job = CreateNewJob(TYPE_REMOVE_RESOURCE_FROM_DIRECTORY); 550 JobEntry* new_job = CreateNewJob(TYPE_REMOVE_RESOURCE_FROM_DIRECTORY);
551 new_job->context = context; 551 new_job->context = context;
552 new_job->task = base::Bind( 552 new_job->task = base::Bind(
553 &DriveServiceInterface::RemoveResourceFromDirectory, 553 &DriveServiceInterface::RemoveResourceFromDirectory,
554 base::Unretained(drive_service_), 554 base::Unretained(drive_service_),
555 parent_resource_id, 555 parent_resource_id,
556 resource_id, 556 resource_id,
557 base::Bind(&JobScheduler::OnEntryActionJobDone, 557 base::Bind(&JobScheduler::OnEntryActionJobDone,
558 weak_ptr_factory_.GetWeakPtr(), 558 weak_ptr_factory_.GetWeakPtr(),
559 new_job->job_info.job_id, 559 new_job->job_info.job_id,
560 callback)); 560 callback));
561 new_job->abort_callback = callback; 561 new_job->abort_callback = callback;
562 StartJob(new_job); 562 StartJob(new_job);
563 } 563 }
564 564
565 void JobScheduler::AddNewDirectory( 565 void JobScheduler::AddNewDirectory(
566 const std::string& parent_resource_id, 566 const std::string& parent_resource_id,
567 const std::string& directory_title, 567 const std::string& directory_title,
568 const DriveServiceInterface::AddNewDirectoryOptions& options, 568 const DriveServiceInterface::AddNewDirectoryOptions& options,
569 const ClientContext& context, 569 const ClientContext& context,
570 const google_apis::FileResourceCallback& callback) { 570 const google_apis::FileResourceCallback& callback) {
571 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 571 DCHECK_CURRENTLY_ON(BrowserThread::UI);
572 572
573 JobEntry* new_job = CreateNewJob(TYPE_ADD_NEW_DIRECTORY); 573 JobEntry* new_job = CreateNewJob(TYPE_ADD_NEW_DIRECTORY);
574 new_job->context = context; 574 new_job->context = context;
575 new_job->task = base::Bind( 575 new_job->task = base::Bind(
576 &DriveServiceInterface::AddNewDirectory, 576 &DriveServiceInterface::AddNewDirectory,
577 base::Unretained(drive_service_), 577 base::Unretained(drive_service_),
578 parent_resource_id, 578 parent_resource_id,
579 directory_title, 579 directory_title,
580 options, 580 options,
581 base::Bind(&JobScheduler::OnGetFileResourceJobDone, 581 base::Bind(&JobScheduler::OnGetFileResourceJobDone,
582 weak_ptr_factory_.GetWeakPtr(), 582 weak_ptr_factory_.GetWeakPtr(),
583 new_job->job_info.job_id, 583 new_job->job_info.job_id,
584 callback)); 584 callback));
585 new_job->abort_callback = CreateErrorRunCallback(callback); 585 new_job->abort_callback = CreateErrorRunCallback(callback);
586 StartJob(new_job); 586 StartJob(new_job);
587 } 587 }
588 588
589 JobID JobScheduler::DownloadFile( 589 JobID JobScheduler::DownloadFile(
590 const base::FilePath& virtual_path, 590 const base::FilePath& virtual_path,
591 int64 expected_file_size, 591 int64 expected_file_size,
592 const base::FilePath& local_cache_path, 592 const base::FilePath& local_cache_path,
593 const std::string& resource_id, 593 const std::string& resource_id,
594 const ClientContext& context, 594 const ClientContext& context,
595 const google_apis::DownloadActionCallback& download_action_callback, 595 const google_apis::DownloadActionCallback& download_action_callback,
596 const google_apis::GetContentCallback& get_content_callback) { 596 const google_apis::GetContentCallback& get_content_callback) {
597 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 597 DCHECK_CURRENTLY_ON(BrowserThread::UI);
598 598
599 // Temporary histogram for crbug.com/229650. 599 // Temporary histogram for crbug.com/229650.
600 CollectCopyHistogramSample("Drive.DownloadFromDriveFileSize", 600 CollectCopyHistogramSample("Drive.DownloadFromDriveFileSize",
601 expected_file_size); 601 expected_file_size);
602 602
603 JobEntry* new_job = CreateNewJob(TYPE_DOWNLOAD_FILE); 603 JobEntry* new_job = CreateNewJob(TYPE_DOWNLOAD_FILE);
604 new_job->job_info.file_path = virtual_path; 604 new_job->job_info.file_path = virtual_path;
605 new_job->job_info.num_total_bytes = expected_file_size; 605 new_job->job_info.num_total_bytes = expected_file_size;
606 new_job->context = context; 606 new_job->context = context;
607 new_job->task = base::Bind( 607 new_job->task = base::Bind(
(...skipping 16 matching lines...) Expand all
624 624
625 void JobScheduler::UploadNewFile( 625 void JobScheduler::UploadNewFile(
626 const std::string& parent_resource_id, 626 const std::string& parent_resource_id,
627 const base::FilePath& drive_file_path, 627 const base::FilePath& drive_file_path,
628 const base::FilePath& local_file_path, 628 const base::FilePath& local_file_path,
629 const std::string& title, 629 const std::string& title,
630 const std::string& content_type, 630 const std::string& content_type,
631 const DriveUploader::UploadNewFileOptions& options, 631 const DriveUploader::UploadNewFileOptions& options,
632 const ClientContext& context, 632 const ClientContext& context,
633 const google_apis::FileResourceCallback& callback) { 633 const google_apis::FileResourceCallback& callback) {
634 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 634 DCHECK_CURRENTLY_ON(BrowserThread::UI);
635 635
636 JobEntry* new_job = CreateNewJob(TYPE_UPLOAD_NEW_FILE); 636 JobEntry* new_job = CreateNewJob(TYPE_UPLOAD_NEW_FILE);
637 new_job->job_info.file_path = drive_file_path; 637 new_job->job_info.file_path = drive_file_path;
638 new_job->context = context; 638 new_job->context = context;
639 639
640 GetFileSizeForJob( 640 GetFileSizeForJob(
641 blocking_task_runner_, local_file_path, 641 blocking_task_runner_, local_file_path,
642 base::Bind(&JobScheduler::OnGotFileSizeForJob, 642 base::Bind(&JobScheduler::OnGotFileSizeForJob,
643 weak_ptr_factory_.GetWeakPtr(), new_job->job_info.job_id, 643 weak_ptr_factory_.GetWeakPtr(), new_job->job_info.job_id,
644 "Drive.UploadToDriveFileSize")); 644 "Drive.UploadToDriveFileSize"));
(...skipping 23 matching lines...) Expand all
668 } 668 }
669 669
670 void JobScheduler::UploadExistingFile( 670 void JobScheduler::UploadExistingFile(
671 const std::string& resource_id, 671 const std::string& resource_id,
672 const base::FilePath& drive_file_path, 672 const base::FilePath& drive_file_path,
673 const base::FilePath& local_file_path, 673 const base::FilePath& local_file_path,
674 const std::string& content_type, 674 const std::string& content_type,
675 const DriveUploader::UploadExistingFileOptions& options, 675 const DriveUploader::UploadExistingFileOptions& options,
676 const ClientContext& context, 676 const ClientContext& context,
677 const google_apis::FileResourceCallback& callback) { 677 const google_apis::FileResourceCallback& callback) {
678 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 678 DCHECK_CURRENTLY_ON(BrowserThread::UI);
679 679
680 JobEntry* new_job = CreateNewJob(TYPE_UPLOAD_EXISTING_FILE); 680 JobEntry* new_job = CreateNewJob(TYPE_UPLOAD_EXISTING_FILE);
681 new_job->job_info.file_path = drive_file_path; 681 new_job->job_info.file_path = drive_file_path;
682 new_job->context = context; 682 new_job->context = context;
683 683
684 GetFileSizeForJob( 684 GetFileSizeForJob(
685 blocking_task_runner_, local_file_path, 685 blocking_task_runner_, local_file_path,
686 base::Bind(&JobScheduler::OnGotFileSizeForJob, 686 base::Bind(&JobScheduler::OnGotFileSizeForJob,
687 weak_ptr_factory_.GetWeakPtr(), new_job->job_info.job_id, 687 weak_ptr_factory_.GetWeakPtr(), new_job->job_info.job_id,
688 "Drive.UploadToDriveFileSize")); 688 "Drive.UploadToDriveFileSize"));
(...skipping 19 matching lines...) Expand all
708 new_job->task = base::Bind(&RunUploadExistingFile, uploader_.get(), params); 708 new_job->task = base::Bind(&RunUploadExistingFile, uploader_.get(), params);
709 new_job->abort_callback = CreateErrorRunCallback(callback); 709 new_job->abort_callback = CreateErrorRunCallback(callback);
710 StartJob(new_job); 710 StartJob(new_job);
711 } 711 }
712 712
713 void JobScheduler::AddPermission( 713 void JobScheduler::AddPermission(
714 const std::string& resource_id, 714 const std::string& resource_id,
715 const std::string& email, 715 const std::string& email,
716 google_apis::drive::PermissionRole role, 716 google_apis::drive::PermissionRole role,
717 const google_apis::EntryActionCallback& callback) { 717 const google_apis::EntryActionCallback& callback) {
718 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 718 DCHECK_CURRENTLY_ON(BrowserThread::UI);
719 DCHECK(!callback.is_null()); 719 DCHECK(!callback.is_null());
720 720
721 JobEntry* new_job = CreateNewJob(TYPE_ADD_PERMISSION); 721 JobEntry* new_job = CreateNewJob(TYPE_ADD_PERMISSION);
722 new_job->task = base::Bind(&DriveServiceInterface::AddPermission, 722 new_job->task = base::Bind(&DriveServiceInterface::AddPermission,
723 base::Unretained(drive_service_), 723 base::Unretained(drive_service_),
724 resource_id, 724 resource_id,
725 email, 725 email,
726 role, 726 role,
727 base::Bind(&JobScheduler::OnEntryActionJobDone, 727 base::Bind(&JobScheduler::OnEntryActionJobDone,
728 weak_ptr_factory_.GetWeakPtr(), 728 weak_ptr_factory_.GetWeakPtr(),
(...skipping 11 matching lines...) Expand all
740 740
741 void JobScheduler::StartJob(JobEntry* job) { 741 void JobScheduler::StartJob(JobEntry* job) {
742 DCHECK(!job->task.is_null()); 742 DCHECK(!job->task.is_null());
743 743
744 QueueJob(job->job_info.job_id); 744 QueueJob(job->job_info.job_id);
745 NotifyJobAdded(job->job_info); 745 NotifyJobAdded(job->job_info);
746 DoJobLoop(GetJobQueueType(job->job_info.job_type)); 746 DoJobLoop(GetJobQueueType(job->job_info.job_type));
747 } 747 }
748 748
749 void JobScheduler::QueueJob(JobID job_id) { 749 void JobScheduler::QueueJob(JobID job_id) {
750 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 750 DCHECK_CURRENTLY_ON(BrowserThread::UI);
751 751
752 JobEntry* job_entry = job_map_.Lookup(job_id); 752 JobEntry* job_entry = job_map_.Lookup(job_id);
753 DCHECK(job_entry); 753 DCHECK(job_entry);
754 const JobInfo& job_info = job_entry->job_info; 754 const JobInfo& job_info = job_entry->job_info;
755 755
756 const QueueType queue_type = GetJobQueueType(job_info.job_type); 756 const QueueType queue_type = GetJobQueueType(job_info.job_type);
757 queue_[queue_type]->Push(job_id, job_entry->context.type); 757 queue_[queue_type]->Push(job_id, job_entry->context.type);
758 758
759 // Temporary histogram for crbug.com/229650. 759 // Temporary histogram for crbug.com/229650.
760 if (job_info.job_type == TYPE_DOWNLOAD_FILE || 760 if (job_info.job_type == TYPE_DOWNLOAD_FILE ||
(...skipping 12 matching lines...) Expand all
773 const std::string retry_prefix = job_entry->retry_count > 0 ? 773 const std::string retry_prefix = job_entry->retry_count > 0 ?
774 base::StringPrintf(" (retry %d)", job_entry->retry_count) : ""; 774 base::StringPrintf(" (retry %d)", job_entry->retry_count) : "";
775 logger_->Log(logging::LOG_INFO, 775 logger_->Log(logging::LOG_INFO,
776 "Job queued%s: %s - %s", 776 "Job queued%s: %s - %s",
777 retry_prefix.c_str(), 777 retry_prefix.c_str(),
778 job_info.ToString().c_str(), 778 job_info.ToString().c_str(),
779 GetQueueInfo(queue_type).c_str()); 779 GetQueueInfo(queue_type).c_str());
780 } 780 }
781 781
782 void JobScheduler::DoJobLoop(QueueType queue_type) { 782 void JobScheduler::DoJobLoop(QueueType queue_type) {
783 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 783 DCHECK_CURRENTLY_ON(BrowserThread::UI);
784 784
785 const int accepted_priority = GetCurrentAcceptedPriority(queue_type); 785 const int accepted_priority = GetCurrentAcceptedPriority(queue_type);
786 786
787 // Abort all USER_INITAITED jobs when not accepted. 787 // Abort all USER_INITAITED jobs when not accepted.
788 if (accepted_priority < USER_INITIATED) { 788 if (accepted_priority < USER_INITIATED) {
789 std::vector<JobID> jobs; 789 std::vector<JobID> jobs;
790 queue_[queue_type]->GetQueuedJobs(USER_INITIATED, &jobs); 790 queue_[queue_type]->GetQueuedJobs(USER_INITIATED, &jobs);
791 for (size_t i = 0; i < jobs.size(); ++i) { 791 for (size_t i = 0; i < jobs.size(); ++i) {
792 JobEntry* job = job_map_.Lookup(jobs[i]); 792 JobEntry* job = job_map_.Lookup(jobs[i]);
793 DCHECK(job); 793 DCHECK(job);
(...skipping 30 matching lines...) Expand all
824 824
825 UpdateWait(); 825 UpdateWait();
826 826
827 logger_->Log(logging::LOG_INFO, 827 logger_->Log(logging::LOG_INFO,
828 "Job started: %s - %s", 828 "Job started: %s - %s",
829 job_info->ToString().c_str(), 829 job_info->ToString().c_str(),
830 GetQueueInfo(queue_type).c_str()); 830 GetQueueInfo(queue_type).c_str());
831 } 831 }
832 832
833 int JobScheduler::GetCurrentAcceptedPriority(QueueType queue_type) { 833 int JobScheduler::GetCurrentAcceptedPriority(QueueType queue_type) {
834 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 834 DCHECK_CURRENTLY_ON(BrowserThread::UI);
835 835
836 const int kNoJobShouldRun = -1; 836 const int kNoJobShouldRun = -1;
837 837
838 // Should stop if Drive was disabled while running the fetch loop. 838 // Should stop if Drive was disabled while running the fetch loop.
839 if (pref_service_->GetBoolean(prefs::kDisableDrive)) 839 if (pref_service_->GetBoolean(prefs::kDisableDrive))
840 return kNoJobShouldRun; 840 return kNoJobShouldRun;
841 841
842 // Should stop if the network is not online. 842 // Should stop if the network is not online.
843 if (net::NetworkChangeNotifier::IsOffline()) 843 if (net::NetworkChangeNotifier::IsOffline())
844 return kNoJobShouldRun; 844 return kNoJobShouldRun;
845 845
846 // For the file queue, if it is on cellular network, only user initiated 846 // For the file queue, if it is on cellular network, only user initiated
847 // operations are allowed to start. 847 // operations are allowed to start.
848 if (queue_type == FILE_QUEUE && 848 if (queue_type == FILE_QUEUE &&
849 pref_service_->GetBoolean(prefs::kDisableDriveOverCellular) && 849 pref_service_->GetBoolean(prefs::kDisableDriveOverCellular) &&
850 net::NetworkChangeNotifier::IsConnectionCellular( 850 net::NetworkChangeNotifier::IsConnectionCellular(
851 net::NetworkChangeNotifier::GetConnectionType())) 851 net::NetworkChangeNotifier::GetConnectionType()))
852 return USER_INITIATED; 852 return USER_INITIATED;
853 853
854 // Otherwise, every operations including background tasks are allowed. 854 // Otherwise, every operations including background tasks are allowed.
855 return BACKGROUND; 855 return BACKGROUND;
856 } 856 }
857 857
858 void JobScheduler::UpdateWait() { 858 void JobScheduler::UpdateWait() {
859 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 859 DCHECK_CURRENTLY_ON(BrowserThread::UI);
860 860
861 if (disable_throttling_ || throttle_count_ == 0) 861 if (disable_throttling_ || throttle_count_ == 0)
862 return; 862 return;
863 863
864 // Exponential backoff: https://developers.google.com/drive/handle-errors. 864 // Exponential backoff: https://developers.google.com/drive/handle-errors.
865 base::TimeDelta delay = 865 base::TimeDelta delay =
866 base::TimeDelta::FromSeconds(1 << (throttle_count_ - 1)) + 866 base::TimeDelta::FromSeconds(1 << (throttle_count_ - 1)) +
867 base::TimeDelta::FromMilliseconds(base::RandInt(0, 1000)); 867 base::TimeDelta::FromMilliseconds(base::RandInt(0, 1000));
868 VLOG(1) << "Throttling for " << delay.InMillisecondsF(); 868 VLOG(1) << "Throttling for " << delay.InMillisecondsF();
869 869
870 wait_until_ = std::max(wait_until_, base::Time::Now() + delay); 870 wait_until_ = std::max(wait_until_, base::Time::Now() + delay);
871 } 871 }
872 872
873 bool JobScheduler::OnJobDone(JobID job_id, 873 bool JobScheduler::OnJobDone(JobID job_id,
874 google_apis::DriveApiErrorCode error) { 874 google_apis::DriveApiErrorCode error) {
875 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 875 DCHECK_CURRENTLY_ON(BrowserThread::UI);
876 876
877 JobEntry* job_entry = job_map_.Lookup(job_id); 877 JobEntry* job_entry = job_map_.Lookup(job_id);
878 DCHECK(job_entry); 878 DCHECK(job_entry);
879 JobInfo* job_info = &job_entry->job_info; 879 JobInfo* job_info = &job_entry->job_info;
880 QueueType queue_type = GetJobQueueType(job_info->job_type); 880 QueueType queue_type = GetJobQueueType(job_info->job_type);
881 queue_[queue_type]->MarkFinished(job_id); 881 queue_[queue_type]->MarkFinished(job_id);
882 882
883 const base::TimeDelta elapsed = base::Time::Now() - job_info->start_time; 883 const base::TimeDelta elapsed = base::Time::Now() - job_info->start_time;
884 bool success = (GDataToFileError(error) == FILE_ERROR_OK); 884 bool success = (GDataToFileError(error) == FILE_ERROR_OK);
885 logger_->Log(success ? logging::LOG_INFO : logging::LOG_WARNING, 885 logger_->Log(success ? logging::LOG_INFO : logging::LOG_WARNING,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
926 weak_ptr_factory_.GetWeakPtr(), 926 weak_ptr_factory_.GetWeakPtr(),
927 queue_type)); 927 queue_type));
928 return !should_retry; 928 return !should_retry;
929 } 929 }
930 930
931 void JobScheduler::OnGetFileListJobDone( 931 void JobScheduler::OnGetFileListJobDone(
932 JobID job_id, 932 JobID job_id,
933 const google_apis::FileListCallback& callback, 933 const google_apis::FileListCallback& callback,
934 google_apis::DriveApiErrorCode error, 934 google_apis::DriveApiErrorCode error,
935 scoped_ptr<google_apis::FileList> file_list) { 935 scoped_ptr<google_apis::FileList> file_list) {
936 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 936 DCHECK_CURRENTLY_ON(BrowserThread::UI);
937 DCHECK(!callback.is_null()); 937 DCHECK(!callback.is_null());
938 938
939 if (OnJobDone(job_id, error)) 939 if (OnJobDone(job_id, error))
940 callback.Run(error, file_list.Pass()); 940 callback.Run(error, file_list.Pass());
941 } 941 }
942 942
943 void JobScheduler::OnGetChangeListJobDone( 943 void JobScheduler::OnGetChangeListJobDone(
944 JobID job_id, 944 JobID job_id,
945 const google_apis::ChangeListCallback& callback, 945 const google_apis::ChangeListCallback& callback,
946 google_apis::DriveApiErrorCode error, 946 google_apis::DriveApiErrorCode error,
947 scoped_ptr<google_apis::ChangeList> change_list) { 947 scoped_ptr<google_apis::ChangeList> change_list) {
948 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 948 DCHECK_CURRENTLY_ON(BrowserThread::UI);
949 DCHECK(!callback.is_null()); 949 DCHECK(!callback.is_null());
950 950
951 if (OnJobDone(job_id, error)) 951 if (OnJobDone(job_id, error))
952 callback.Run(error, change_list.Pass()); 952 callback.Run(error, change_list.Pass());
953 } 953 }
954 954
955 void JobScheduler::OnGetFileResourceJobDone( 955 void JobScheduler::OnGetFileResourceJobDone(
956 JobID job_id, 956 JobID job_id,
957 const google_apis::FileResourceCallback& callback, 957 const google_apis::FileResourceCallback& callback,
958 google_apis::DriveApiErrorCode error, 958 google_apis::DriveApiErrorCode error,
959 scoped_ptr<google_apis::FileResource> entry) { 959 scoped_ptr<google_apis::FileResource> entry) {
960 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 960 DCHECK_CURRENTLY_ON(BrowserThread::UI);
961 DCHECK(!callback.is_null()); 961 DCHECK(!callback.is_null());
962 962
963 if (OnJobDone(job_id, error)) 963 if (OnJobDone(job_id, error))
964 callback.Run(error, entry.Pass()); 964 callback.Run(error, entry.Pass());
965 } 965 }
966 966
967 void JobScheduler::OnGetAboutResourceJobDone( 967 void JobScheduler::OnGetAboutResourceJobDone(
968 JobID job_id, 968 JobID job_id,
969 const google_apis::AboutResourceCallback& callback, 969 const google_apis::AboutResourceCallback& callback,
970 google_apis::DriveApiErrorCode error, 970 google_apis::DriveApiErrorCode error,
971 scoped_ptr<google_apis::AboutResource> about_resource) { 971 scoped_ptr<google_apis::AboutResource> about_resource) {
972 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 972 DCHECK_CURRENTLY_ON(BrowserThread::UI);
973 DCHECK(!callback.is_null()); 973 DCHECK(!callback.is_null());
974 974
975 if (OnJobDone(job_id, error)) 975 if (OnJobDone(job_id, error))
976 callback.Run(error, about_resource.Pass()); 976 callback.Run(error, about_resource.Pass());
977 } 977 }
978 978
979 void JobScheduler::OnGetShareUrlJobDone( 979 void JobScheduler::OnGetShareUrlJobDone(
980 JobID job_id, 980 JobID job_id,
981 const google_apis::GetShareUrlCallback& callback, 981 const google_apis::GetShareUrlCallback& callback,
982 google_apis::DriveApiErrorCode error, 982 google_apis::DriveApiErrorCode error,
983 const GURL& share_url) { 983 const GURL& share_url) {
984 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 984 DCHECK_CURRENTLY_ON(BrowserThread::UI);
985 DCHECK(!callback.is_null()); 985 DCHECK(!callback.is_null());
986 986
987 if (OnJobDone(job_id, error)) 987 if (OnJobDone(job_id, error))
988 callback.Run(error, share_url); 988 callback.Run(error, share_url);
989 } 989 }
990 990
991 void JobScheduler::OnGetAppListJobDone( 991 void JobScheduler::OnGetAppListJobDone(
992 JobID job_id, 992 JobID job_id,
993 const google_apis::AppListCallback& callback, 993 const google_apis::AppListCallback& callback,
994 google_apis::DriveApiErrorCode error, 994 google_apis::DriveApiErrorCode error,
995 scoped_ptr<google_apis::AppList> app_list) { 995 scoped_ptr<google_apis::AppList> app_list) {
996 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 996 DCHECK_CURRENTLY_ON(BrowserThread::UI);
997 DCHECK(!callback.is_null()); 997 DCHECK(!callback.is_null());
998 998
999 if (OnJobDone(job_id, error)) 999 if (OnJobDone(job_id, error))
1000 callback.Run(error, app_list.Pass()); 1000 callback.Run(error, app_list.Pass());
1001 } 1001 }
1002 1002
1003 void JobScheduler::OnEntryActionJobDone( 1003 void JobScheduler::OnEntryActionJobDone(
1004 JobID job_id, 1004 JobID job_id,
1005 const google_apis::EntryActionCallback& callback, 1005 const google_apis::EntryActionCallback& callback,
1006 google_apis::DriveApiErrorCode error) { 1006 google_apis::DriveApiErrorCode error) {
1007 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1007 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1008 DCHECK(!callback.is_null()); 1008 DCHECK(!callback.is_null());
1009 1009
1010 if (OnJobDone(job_id, error)) 1010 if (OnJobDone(job_id, error))
1011 callback.Run(error); 1011 callback.Run(error);
1012 } 1012 }
1013 1013
1014 void JobScheduler::OnDownloadActionJobDone( 1014 void JobScheduler::OnDownloadActionJobDone(
1015 JobID job_id, 1015 JobID job_id,
1016 const google_apis::DownloadActionCallback& callback, 1016 const google_apis::DownloadActionCallback& callback,
1017 google_apis::DriveApiErrorCode error, 1017 google_apis::DriveApiErrorCode error,
1018 const base::FilePath& temp_file) { 1018 const base::FilePath& temp_file) {
1019 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1019 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1020 DCHECK(!callback.is_null()); 1020 DCHECK(!callback.is_null());
1021 1021
1022 if (OnJobDone(job_id, error)) 1022 if (OnJobDone(job_id, error))
1023 callback.Run(error, temp_file); 1023 callback.Run(error, temp_file);
1024 } 1024 }
1025 1025
1026 void JobScheduler::OnUploadCompletionJobDone( 1026 void JobScheduler::OnUploadCompletionJobDone(
1027 JobID job_id, 1027 JobID job_id,
1028 const ResumeUploadParams& resume_params, 1028 const ResumeUploadParams& resume_params,
1029 const google_apis::FileResourceCallback& callback, 1029 const google_apis::FileResourceCallback& callback,
1030 google_apis::DriveApiErrorCode error, 1030 google_apis::DriveApiErrorCode error,
1031 const GURL& upload_location, 1031 const GURL& upload_location,
1032 scoped_ptr<google_apis::FileResource> entry) { 1032 scoped_ptr<google_apis::FileResource> entry) {
1033 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1033 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1034 DCHECK(!callback.is_null()); 1034 DCHECK(!callback.is_null());
1035 1035
1036 if (!upload_location.is_empty()) { 1036 if (!upload_location.is_empty()) {
1037 // If upload_location is available, update the task to resume the 1037 // If upload_location is available, update the task to resume the
1038 // upload process from the terminated point. 1038 // upload process from the terminated point.
1039 // When we need to retry, the error code should be HTTP_SERVICE_UNAVAILABLE 1039 // When we need to retry, the error code should be HTTP_SERVICE_UNAVAILABLE
1040 // so OnJobDone called below will be in charge to re-queue the job. 1040 // so OnJobDone called below will be in charge to re-queue the job.
1041 JobEntry* job_entry = job_map_.Lookup(job_id); 1041 JobEntry* job_entry = job_map_.Lookup(job_id);
1042 DCHECK(job_entry); 1042 DCHECK(job_entry);
1043 1043
(...skipping 16 matching lines...) Expand all
1060 callback.Run(error, entry.Pass()); 1060 callback.Run(error, entry.Pass());
1061 } 1061 }
1062 1062
1063 void JobScheduler::OnResumeUploadFileDone( 1063 void JobScheduler::OnResumeUploadFileDone(
1064 JobID job_id, 1064 JobID job_id,
1065 const base::Callback<google_apis::CancelCallback()>& original_task, 1065 const base::Callback<google_apis::CancelCallback()>& original_task,
1066 const google_apis::FileResourceCallback& callback, 1066 const google_apis::FileResourceCallback& callback,
1067 google_apis::DriveApiErrorCode error, 1067 google_apis::DriveApiErrorCode error,
1068 const GURL& upload_location, 1068 const GURL& upload_location,
1069 scoped_ptr<google_apis::FileResource> entry) { 1069 scoped_ptr<google_apis::FileResource> entry) {
1070 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1070 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1071 DCHECK(!original_task.is_null()); 1071 DCHECK(!original_task.is_null());
1072 DCHECK(!callback.is_null()); 1072 DCHECK(!callback.is_null());
1073 1073
1074 if (upload_location.is_empty()) { 1074 if (upload_location.is_empty()) {
1075 // If upload_location is not available, we should discard it and stop trying 1075 // If upload_location is not available, we should discard it and stop trying
1076 // to resume. Restore the original task. 1076 // to resume. Restore the original task.
1077 JobEntry* job_entry = job_map_.Lookup(job_id); 1077 JobEntry* job_entry = job_map_.Lookup(job_id);
1078 DCHECK(job_entry); 1078 DCHECK(job_entry);
1079 job_entry->task = original_task; 1079 job_entry->task = original_task;
1080 } 1080 }
1081 1081
1082 if (OnJobDone(job_id, error)) 1082 if (OnJobDone(job_id, error))
1083 callback.Run(error, entry.Pass()); 1083 callback.Run(error, entry.Pass());
1084 } 1084 }
1085 1085
1086 void JobScheduler::UpdateProgress(JobID job_id, int64 progress, int64 total) { 1086 void JobScheduler::UpdateProgress(JobID job_id, int64 progress, int64 total) {
1087 JobEntry* job_entry = job_map_.Lookup(job_id); 1087 JobEntry* job_entry = job_map_.Lookup(job_id);
1088 DCHECK(job_entry); 1088 DCHECK(job_entry);
1089 1089
1090 job_entry->job_info.num_completed_bytes = progress; 1090 job_entry->job_info.num_completed_bytes = progress;
1091 if (total != -1) 1091 if (total != -1)
1092 job_entry->job_info.num_total_bytes = total; 1092 job_entry->job_info.num_total_bytes = total;
1093 NotifyJobUpdated(job_entry->job_info); 1093 NotifyJobUpdated(job_entry->job_info);
1094 } 1094 }
1095 1095
1096 void JobScheduler::OnConnectionTypeChanged( 1096 void JobScheduler::OnConnectionTypeChanged(
1097 net::NetworkChangeNotifier::ConnectionType type) { 1097 net::NetworkChangeNotifier::ConnectionType type) {
1098 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1098 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1099 1099
1100 // Resume the job loop. 1100 // Resume the job loop.
1101 // Note that we don't need to check the network connection status as it will 1101 // Note that we don't need to check the network connection status as it will
1102 // be checked in GetCurrentAcceptedPriority(). 1102 // be checked in GetCurrentAcceptedPriority().
1103 for (int i = METADATA_QUEUE; i < NUM_QUEUES; ++i) 1103 for (int i = METADATA_QUEUE; i < NUM_QUEUES; ++i)
1104 DoJobLoop(static_cast<QueueType>(i)); 1104 DoJobLoop(static_cast<QueueType>(i));
1105 } 1105 }
1106 1106
1107 void JobScheduler::OnGotFileSizeForJob(JobID job_id, 1107 void JobScheduler::OnGotFileSizeForJob(JobID job_id,
1108 const std::string& histogram_name, 1108 const std::string& histogram_name,
1109 int64* size) { 1109 int64* size) {
1110 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1110 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1111 if (*size == -1) 1111 if (*size == -1)
1112 return; 1112 return;
1113 1113
1114 // Temporary histogram for crbug.com/229650. 1114 // Temporary histogram for crbug.com/229650.
1115 CollectCopyHistogramSample(histogram_name, *size); 1115 CollectCopyHistogramSample(histogram_name, *size);
1116 1116
1117 JobEntry* const job_entry = job_map_.Lookup(job_id); 1117 JobEntry* const job_entry = job_map_.Lookup(job_id);
1118 if (!job_entry) 1118 if (!job_entry)
1119 return; 1119 return;
1120 1120
(...skipping 26 matching lines...) Expand all
1147 case TYPE_UPLOAD_NEW_FILE: 1147 case TYPE_UPLOAD_NEW_FILE:
1148 case TYPE_UPLOAD_EXISTING_FILE: 1148 case TYPE_UPLOAD_EXISTING_FILE:
1149 return FILE_QUEUE; 1149 return FILE_QUEUE;
1150 } 1150 }
1151 NOTREACHED(); 1151 NOTREACHED();
1152 return FILE_QUEUE; 1152 return FILE_QUEUE;
1153 } 1153 }
1154 1154
1155 void JobScheduler::AbortNotRunningJob(JobEntry* job, 1155 void JobScheduler::AbortNotRunningJob(JobEntry* job,
1156 google_apis::DriveApiErrorCode error) { 1156 google_apis::DriveApiErrorCode error) {
1157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1157 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1158 1158
1159 const base::TimeDelta elapsed = base::Time::Now() - job->job_info.start_time; 1159 const base::TimeDelta elapsed = base::Time::Now() - job->job_info.start_time;
1160 const QueueType queue_type = GetJobQueueType(job->job_info.job_type); 1160 const QueueType queue_type = GetJobQueueType(job->job_info.job_type);
1161 logger_->Log(logging::LOG_INFO, 1161 logger_->Log(logging::LOG_INFO,
1162 "Job aborted: %s => %s (elapsed time: %sms) - %s", 1162 "Job aborted: %s => %s (elapsed time: %sms) - %s",
1163 job->job_info.ToString().c_str(), 1163 job->job_info.ToString().c_str(),
1164 DriveApiErrorCodeToString(error).c_str(), 1164 DriveApiErrorCodeToString(error).c_str(),
1165 base::Int64ToString(elapsed.InMilliseconds()).c_str(), 1165 base::Int64ToString(elapsed.InMilliseconds()).c_str(),
1166 GetQueueInfo(queue_type).c_str()); 1166 GetQueueInfo(queue_type).c_str());
1167 1167
1168 base::Callback<void(google_apis::DriveApiErrorCode)> callback = 1168 base::Callback<void(google_apis::DriveApiErrorCode)> callback =
1169 job->abort_callback; 1169 job->abort_callback;
1170 queue_[GetJobQueueType(job->job_info.job_type)]->Remove(job->job_info.job_id); 1170 queue_[GetJobQueueType(job->job_info.job_type)]->Remove(job->job_info.job_id);
1171 NotifyJobDone(job->job_info, error); 1171 NotifyJobDone(job->job_info, error);
1172 job_map_.Remove(job->job_info.job_id); 1172 job_map_.Remove(job->job_info.job_id);
1173 base::MessageLoopProxy::current()->PostTask(FROM_HERE, 1173 base::MessageLoopProxy::current()->PostTask(FROM_HERE,
1174 base::Bind(callback, error)); 1174 base::Bind(callback, error));
1175 } 1175 }
1176 1176
1177 void JobScheduler::NotifyJobAdded(const JobInfo& job_info) { 1177 void JobScheduler::NotifyJobAdded(const JobInfo& job_info) {
1178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1178 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1179 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobAdded(job_info)); 1179 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobAdded(job_info));
1180 } 1180 }
1181 1181
1182 void JobScheduler::NotifyJobDone(const JobInfo& job_info, 1182 void JobScheduler::NotifyJobDone(const JobInfo& job_info,
1183 google_apis::DriveApiErrorCode error) { 1183 google_apis::DriveApiErrorCode error) {
1184 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1184 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1185 FOR_EACH_OBSERVER(JobListObserver, observer_list_, 1185 FOR_EACH_OBSERVER(JobListObserver, observer_list_,
1186 OnJobDone(job_info, GDataToFileError(error))); 1186 OnJobDone(job_info, GDataToFileError(error)));
1187 } 1187 }
1188 1188
1189 void JobScheduler::NotifyJobUpdated(const JobInfo& job_info) { 1189 void JobScheduler::NotifyJobUpdated(const JobInfo& job_info) {
1190 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1190 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1191 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobUpdated(job_info)); 1191 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobUpdated(job_info));
1192 } 1192 }
1193 1193
1194 std::string JobScheduler::GetQueueInfo(QueueType type) const { 1194 std::string JobScheduler::GetQueueInfo(QueueType type) const {
1195 return QueueTypeToString(type) + " " + queue_[type]->ToString(); 1195 return QueueTypeToString(type) + " " + queue_[type]->ToString();
1196 } 1196 }
1197 1197
1198 // static 1198 // static
1199 std::string JobScheduler::QueueTypeToString(QueueType type) { 1199 std::string JobScheduler::QueueTypeToString(QueueType type) {
1200 switch (type) { 1200 switch (type) {
1201 case METADATA_QUEUE: 1201 case METADATA_QUEUE:
1202 return "METADATA_QUEUE"; 1202 return "METADATA_QUEUE";
1203 case FILE_QUEUE: 1203 case FILE_QUEUE:
1204 return "FILE_QUEUE"; 1204 return "FILE_QUEUE";
1205 case NUM_QUEUES: 1205 case NUM_QUEUES:
1206 break; // This value is just a sentinel. Should never be used. 1206 break; // This value is just a sentinel. Should never be used.
1207 } 1207 }
1208 NOTREACHED(); 1208 NOTREACHED();
1209 return ""; 1209 return "";
1210 } 1210 }
1211 1211
1212 } // namespace drive 1212 } // namespace drive
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698