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

Unified Diff: chrome/browser/chromeos/drive/download_handler.cc

Issue 1414753005: Evict drive cache with file download from website if necessary. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Free disk space immediately in OnDownloadCreated. Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/drive/download_handler.cc
diff --git a/chrome/browser/chromeos/drive/download_handler.cc b/chrome/browser/chromeos/drive/download_handler.cc
index 06bc182a95e4b6ab800ca456ebabdf87543cdf75..7f336aa5cf8d628c827f193ecea87d0201623606 100644
--- a/chrome/browser/chromeos/drive/download_handler.cc
+++ b/chrome/browser/chromeos/drive/download_handler.cc
@@ -8,6 +8,7 @@
#include "base/files/file_util.h"
#include "base/strings/string_util.h"
#include "base/supports_user_data.h"
+#include "base/thread_task_runner_handle.h"
#include "base/threading/sequenced_worker_pool.h"
#include "chrome/browser/chromeos/drive/drive_integration_service.h"
#include "chrome/browser/chromeos/drive/file_system_util.h"
@@ -34,6 +35,10 @@ const char kDrivePathKey[] = "DrivePath";
const char* kGenericMimeTypes[] = {"text/html", "text/plain",
"application/octet-stream"};
+const int64 kDefaultRequestSpace = 512 * (1 << 20); // 512MB
hashimoto 2015/10/28 09:06:15 How was this value chosen? (based on some statisti
yawano 2015/10/28 09:29:44 No, this is not based on some statistics. This va
+
+const base::TimeDelta kFreeDiskSpaceDelay = base::TimeDelta::FromSeconds(5);
+
// User Data stored in DownloadItem for drive path.
class DriveUserData : public base::SupportsUserData::Data {
public:
@@ -125,12 +130,15 @@ std::string FilterOutGenericMimeType(const std::string& mime_type) {
return mime_type;
}
+void IgnoreFreeDiskSpaceIfNeededForCallback(bool /*result*/) {}
+
} // namespace
DownloadHandler::DownloadHandler(FileSystemInterface* file_system)
: file_system_(file_system),
- weak_ptr_factory_(this) {
-}
+ pending_request_space_(0),
+ free_disk_space_delay_(kFreeDiskSpaceDelay),
+ weak_ptr_factory_(this) {}
DownloadHandler::~DownloadHandler() {
}
@@ -237,8 +245,44 @@ void DownloadHandler::CheckForFileExistence(
callback));
}
+void DownloadHandler::SetFreeDiskSpaceDelayForTesting(
+ const base::TimeDelta& delay) {
+ free_disk_space_delay_ = delay;
+}
+
+// TODO(yawano): support multiple in-progress downloads.
hashimoto 2015/10/28 09:06:15 Why don't you support multiple downloads now?
yawano 2015/10/28 09:29:44 I thought it will make this CL larger. But I think
+void DownloadHandler::FreeDiskSpaceIfNeeded(const DownloadItem* download,
+ bool immediate) {
+ if (download->IsDone())
+ return;
+
+ const int64 total_bytes = download->GetTotalBytes();
+ const int64 request_space = total_bytes == 0
hashimoto 2015/10/28 09:06:15 Please add a comment why we need to handle total_b
yawano 2015/10/29 02:52:43 Done.
+ ? kDefaultRequestSpace
hashimoto 2015/10/28 09:06:15 IIUC, when the download is 99% complete, this can
yawano 2015/10/28 09:29:44 This value is used when we don't know total bytes
+ : total_bytes - download->GetReceivedBytes();
+
+ if (immediate) {
+ file_system_->FreeDiskSpaceIfNeededFor(
+ request_space, base::Bind(&IgnoreFreeDiskSpaceIfNeededForCallback));
+
+ return;
+ }
+
+ const bool post_task = pending_request_space_ == 0;
+ pending_request_space_ = request_space;
+
+ if (post_task) {
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+ FROM_HERE, base::Bind(&DownloadHandler::ExecuteFreeDiskSpaceIfNeededFor,
+ weak_ptr_factory_.GetWeakPtr()),
+ free_disk_space_delay_);
+ }
+}
+
void DownloadHandler::OnDownloadCreated(DownloadManager* manager,
DownloadItem* download) {
+ FreeDiskSpaceIfNeeded(download, true /* immediate */);
+
// Remove any persisted Drive DownloadItem. crbug.com/171384
if (IsPersistedDriveDownload(drive_tmp_download_path_, download)) {
// Remove download later, since doing it here results in a crash.
@@ -265,6 +309,8 @@ void DownloadHandler::OnDownloadUpdated(
DownloadManager* manager, DownloadItem* download) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ FreeDiskSpaceIfNeeded(download, false /* not immediate */);
+
// Only accept downloads that have the Drive meta data associated with them.
DriveUserData* data = GetDriveUserData(download);
if (!drive_tmp_download_path_.IsParent(download->GetTargetFilePath()) ||
@@ -345,6 +391,14 @@ void DownloadHandler::SetCacheFilePath(void* manager_id,
data->set_cache_file_path(*cache_file_path);
}
+void DownloadHandler::ExecuteFreeDiskSpaceIfNeededFor() {
+ file_system_->FreeDiskSpaceIfNeededFor(
+ pending_request_space_,
+ base::Bind(&IgnoreFreeDiskSpaceIfNeededForCallback));
+
+ pending_request_space_ = 0;
+}
+
DownloadManager* DownloadHandler::GetDownloadManager(void* manager_id) {
if (manager_id == notifier_->GetManager())
return notifier_->GetManager();

Powered by Google App Engine
This is Rietveld 408576698