Commit af3dfe9c authored by tzik@chromium.org's avatar tzik@chromium.org

[FileAPI] Ignore requests after QuotaReservation::OnClientCrash call.

When a client crash detected, the associated QuotaReservation object reclaims its reserved quota.
And then, in-flight operations should be ignored.

Review URL: https://codereview.chromium.org/139833006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@245481 0039d316-1c4b-4281-b951-d872f2087c98
parent d14eb558
...@@ -15,6 +15,7 @@ void QuotaReservation::RefreshReservation( ...@@ -15,6 +15,7 @@ void QuotaReservation::RefreshReservation(
const StatusCallback& callback) { const StatusCallback& callback) {
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); DCHECK(sequence_checker_.CalledOnValidSequencedThread());
DCHECK(!running_refresh_request_); DCHECK(!running_refresh_request_);
DCHECK(!client_crashed_);
if (!reservation_manager()) if (!reservation_manager())
return; return;
...@@ -33,11 +34,13 @@ void QuotaReservation::RefreshReservation( ...@@ -33,11 +34,13 @@ void QuotaReservation::RefreshReservation(
scoped_ptr<OpenFileHandle> QuotaReservation::GetOpenFileHandle( scoped_ptr<OpenFileHandle> QuotaReservation::GetOpenFileHandle(
const base::FilePath& platform_path) { const base::FilePath& platform_path) {
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); DCHECK(sequence_checker_.CalledOnValidSequencedThread());
DCHECK(!client_crashed_);
return reservation_buffer_->GetOpenFileHandle(this, platform_path); return reservation_buffer_->GetOpenFileHandle(this, platform_path);
} }
void QuotaReservation::OnClientCrash() { void QuotaReservation::OnClientCrash() {
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); DCHECK(sequence_checker_.CalledOnValidSequencedThread());
client_crashed_ = true;
if (remaining_quota_) { if (remaining_quota_) {
reservation_buffer_->PutReservationToBuffer(remaining_quota_); reservation_buffer_->PutReservationToBuffer(remaining_quota_);
...@@ -48,7 +51,9 @@ void QuotaReservation::OnClientCrash() { ...@@ -48,7 +51,9 @@ void QuotaReservation::OnClientCrash() {
void QuotaReservation::ConsumeReservation(int64 size) { void QuotaReservation::ConsumeReservation(int64 size) {
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); DCHECK(sequence_checker_.CalledOnValidSequencedThread());
DCHECK_LT(0, size); DCHECK_LT(0, size);
DCHECK_LT(size, remaining_quota_); DCHECK_LE(size, remaining_quota_);
if (client_crashed_)
return;
remaining_quota_ -= size; remaining_quota_ -= size;
reservation_buffer_->PutReservationToBuffer(size); reservation_buffer_->PutReservationToBuffer(size);
...@@ -68,7 +73,8 @@ FileSystemType QuotaReservation::type() const { ...@@ -68,7 +73,8 @@ FileSystemType QuotaReservation::type() const {
QuotaReservation::QuotaReservation( QuotaReservation::QuotaReservation(
QuotaReservationBuffer* reservation_buffer) QuotaReservationBuffer* reservation_buffer)
: running_refresh_request_(false), : client_crashed_(false),
running_refresh_request_(false),
remaining_quota_(0), remaining_quota_(0),
reservation_buffer_(reservation_buffer), reservation_buffer_(reservation_buffer),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
...@@ -93,11 +99,11 @@ bool QuotaReservation::AdaptDidUpdateReservedQuota( ...@@ -93,11 +99,11 @@ bool QuotaReservation::AdaptDidUpdateReservedQuota(
if (!reservation) if (!reservation)
return false; return false;
reservation->DidUpdateReservedQuota(new_reserved_size, callback, error); return reservation->DidUpdateReservedQuota(
return true; new_reserved_size, callback, error);
} }
void QuotaReservation::DidUpdateReservedQuota( bool QuotaReservation::DidUpdateReservedQuota(
int64 new_reserved_size, int64 new_reserved_size,
const StatusCallback& callback, const StatusCallback& callback,
base::PlatformFileError error) { base::PlatformFileError error) {
...@@ -105,9 +111,15 @@ void QuotaReservation::DidUpdateReservedQuota( ...@@ -105,9 +111,15 @@ void QuotaReservation::DidUpdateReservedQuota(
DCHECK(running_refresh_request_); DCHECK(running_refresh_request_);
running_refresh_request_ = false; running_refresh_request_ = false;
if (client_crashed_) {
callback.Run(base::PLATFORM_FILE_ERROR_ABORT);
return false;
}
if (error == base::PLATFORM_FILE_OK) if (error == base::PLATFORM_FILE_OK)
remaining_quota_ = new_reserved_size; remaining_quota_ = new_reserved_size;
callback.Run(error); callback.Run(error);
return true;
} }
} // namespace fileapi } // namespace fileapi
...@@ -69,10 +69,11 @@ class WEBKIT_STORAGE_BROWSER_EXPORT QuotaReservation ...@@ -69,10 +69,11 @@ class WEBKIT_STORAGE_BROWSER_EXPORT QuotaReservation
int64 new_reserved_size, int64 new_reserved_size,
const StatusCallback& callback, const StatusCallback& callback,
base::PlatformFileError error); base::PlatformFileError error);
void DidUpdateReservedQuota(int64 new_reserved_size, bool DidUpdateReservedQuota(int64 new_reserved_size,
const StatusCallback& callback, const StatusCallback& callback,
base::PlatformFileError error); base::PlatformFileError error);
bool client_crashed_;
bool running_refresh_request_; bool running_refresh_request_;
int64 remaining_quota_; int64 remaining_quota_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment