| 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/file_system/remove_operation.h" | 5 #include "chrome/browser/chromeos/drive/file_system/remove_operation.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 | 8 |
| 9 #include "base/rand_util.h" | 9 #include "base/rand_util.h" |
| 10 #include "chrome/browser/chromeos/drive/drive.pb.h" | 10 #include "chrome/browser/chromeos/drive/drive.pb.h" |
| 11 #include "chrome/browser/chromeos/drive/drive_cache.h" | 11 #include "chrome/browser/chromeos/drive/drive_cache.h" |
| 12 #include "chrome/browser/chromeos/drive/drive_file_system.h" | 12 #include "chrome/browser/chromeos/drive/drive_file_system.h" |
| 13 #include "chrome/browser/chromeos/drive/drive_file_system_util.h" | 13 #include "chrome/browser/chromeos/drive/drive_file_system_util.h" |
| 14 #include "chrome/browser/chromeos/drive/drive_service_interface.h" | 14 #include "chrome/browser/chromeos/drive/drive_service_interface.h" |
| 15 #include "content/public/browser/browser_thread.h" | 15 #include "content/public/browser/browser_thread.h" |
| 16 | 16 |
| 17 using content::BrowserThread; | 17 using content::BrowserThread; |
| 18 | 18 |
| 19 namespace gdata { | 19 namespace drive { |
| 20 | 20 |
| 21 namespace { | 21 namespace { |
| 22 int kMaxRetries = 5; | 22 int kMaxRetries = 5; |
| 23 } | 23 } |
| 24 | 24 |
| 25 namespace file_system { | 25 namespace file_system { |
| 26 | 26 |
| 27 RemoveOperation::RemoveOperation(DriveServiceInterface* drive_service, | 27 RemoveOperation::RemoveOperation(DriveServiceInterface* drive_service, |
| 28 DriveFileSystem* file_system, | 28 DriveFileSystem* file_system, |
| 29 DriveCache* cache) | 29 DriveCache* cache) |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 weak_ptr_factory_.GetWeakPtr(), | 85 weak_ptr_factory_.GetWeakPtr(), |
| 86 callback, | 86 callback, |
| 87 retry_count + 1, | 87 retry_count + 1, |
| 88 base::Passed(&entry_proto))); | 88 base::Passed(&entry_proto))); |
| 89 } | 89 } |
| 90 | 90 |
| 91 void RemoveOperation::RetryIfNeeded( | 91 void RemoveOperation::RetryIfNeeded( |
| 92 const FileOperationCallback& callback, | 92 const FileOperationCallback& callback, |
| 93 int retry_count, | 93 int retry_count, |
| 94 scoped_ptr<DriveEntryProto> entry_proto, | 94 scoped_ptr<DriveEntryProto> entry_proto, |
| 95 GDataErrorCode status, | 95 gdata::GDataErrorCode status, |
| 96 const GURL& /* document_url */) { | 96 const GURL& /* document_url */) { |
| 97 // If the call failed due to flooding the server, and we haven't hit the | 97 // If the call failed due to flooding the server, and we haven't hit the |
| 98 // maximum number of retries, throttle and retry. | 98 // maximum number of retries, throttle and retry. |
| 99 // | 99 // |
| 100 // TODO(zork): Move this retry logic into the scheduler when it is completed. | 100 // TODO(zork): Move this retry logic into the scheduler when it is completed. |
| 101 if ((status == HTTP_SERVICE_UNAVAILABLE || | 101 if ((status == gdata::HTTP_SERVICE_UNAVAILABLE || |
| 102 status == HTTP_INTERNAL_SERVER_ERROR) && | 102 status == gdata::HTTP_INTERNAL_SERVER_ERROR) && |
| 103 retry_count < kMaxRetries) { | 103 retry_count < kMaxRetries) { |
| 104 base::TimeDelta delay = | 104 base::TimeDelta delay = |
| 105 base::TimeDelta::FromSeconds(pow(2, retry_count)) + | 105 base::TimeDelta::FromSeconds(pow(2, retry_count)) + |
| 106 base::TimeDelta::FromMilliseconds(base::RandInt(0, 1000)); | 106 base::TimeDelta::FromMilliseconds(base::RandInt(0, 1000)); |
| 107 | 107 |
| 108 VLOG(1) << "Throttling for " << delay.InMillisecondsF(); | 108 VLOG(1) << "Throttling for " << delay.InMillisecondsF(); |
| 109 const bool posted = base::MessageLoopProxy::current()->PostDelayedTask( | 109 const bool posted = base::MessageLoopProxy::current()->PostDelayedTask( |
| 110 FROM_HERE, | 110 FROM_HERE, |
| 111 base::Bind(&RemoveOperation::DoDelete, | 111 base::Bind(&RemoveOperation::DoDelete, |
| 112 weak_ptr_factory_.GetWeakPtr(), | 112 weak_ptr_factory_.GetWeakPtr(), |
| 113 callback, | 113 callback, |
| 114 retry_count, | 114 retry_count, |
| 115 base::Passed(&entry_proto)), | 115 base::Passed(&entry_proto)), |
| 116 delay); | 116 delay); |
| 117 DCHECK(posted); | 117 DCHECK(posted); |
| 118 } else { | 118 } else { |
| 119 // If the operation completed, or we hit max retries, continue. | 119 // If the operation completed, or we hit max retries, continue. |
| 120 RemoveResourceLocally(callback, | 120 RemoveResourceLocally(callback, |
| 121 entry_proto->resource_id(), | 121 entry_proto->resource_id(), |
| 122 status); | 122 status); |
| 123 } | 123 } |
| 124 } | 124 } |
| 125 | 125 |
| 126 void RemoveOperation::RemoveResourceLocally( | 126 void RemoveOperation::RemoveResourceLocally( |
| 127 const FileOperationCallback& callback, | 127 const FileOperationCallback& callback, |
| 128 const std::string& resource_id, | 128 const std::string& resource_id, |
| 129 GDataErrorCode status) { | 129 gdata::GDataErrorCode status) { |
| 130 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 130 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 131 DCHECK(!callback.is_null()); | 131 DCHECK(!callback.is_null()); |
| 132 | 132 |
| 133 DriveFileError error = util::GDataToDriveFileError(status); | 133 DriveFileError error = util::GDataToDriveFileError(status); |
| 134 if (error != DRIVE_FILE_OK) { | 134 if (error != DRIVE_FILE_OK) { |
| 135 callback.Run(error); | 135 callback.Run(error); |
| 136 return; | 136 return; |
| 137 } | 137 } |
| 138 | 138 |
| 139 file_system_->ResourceMetadata()->RemoveEntryFromParent( | 139 file_system_->ResourceMetadata()->RemoveEntryFromParent( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 150 DriveFileError error, | 150 DriveFileError error, |
| 151 const FilePath& directory_path) { | 151 const FilePath& directory_path) { |
| 152 if (error == DRIVE_FILE_OK) | 152 if (error == DRIVE_FILE_OK) |
| 153 file_system_->OnDirectoryChanged(directory_path); | 153 file_system_->OnDirectoryChanged(directory_path); |
| 154 | 154 |
| 155 if (!callback.is_null()) | 155 if (!callback.is_null()) |
| 156 callback.Run(error); | 156 callback.Run(error); |
| 157 } | 157 } |
| 158 | 158 |
| 159 } // namespace file_system | 159 } // namespace file_system |
| 160 } // namespace gdata | 160 } // namespace drive |
| OLD | NEW |