Commit 16c45c04 authored by fgorski's avatar fgorski Committed by Commit bot

[Offline pages] Reporting correct expiration reason in CleanupTask

BUG=705115

Review-Url: https://codereview.chromium.org/2882213003
Cr-Commit-Position: refs/heads/master@{#472269}
parent f43993b0
......@@ -14,6 +14,24 @@
#include "components/offline_pages/core/background/save_page_request.h"
namespace offline_pages {
namespace {
RequestNotifier::BackgroundSavePageResult ToBackgroundSavePageResult(
OfflinerPolicyUtils::RequestExpirationStatus expiration_status) {
switch (expiration_status) {
case OfflinerPolicyUtils::RequestExpirationStatus::EXPIRED:
return RequestNotifier::BackgroundSavePageResult::EXPIRED;
case OfflinerPolicyUtils::RequestExpirationStatus::START_COUNT_EXCEEDED:
return RequestNotifier::BackgroundSavePageResult::START_COUNT_EXCEEDED;
case OfflinerPolicyUtils::RequestExpirationStatus::
COMPLETION_COUNT_EXCEEDED:
return RequestNotifier::BackgroundSavePageResult::RETRY_COUNT_EXCEEDED;
case OfflinerPolicyUtils::RequestExpirationStatus::VALID:
default:
NOTREACHED();
return RequestNotifier::BackgroundSavePageResult::EXPIRED;
}
}
} // namespace
CleanupTask::CleanupTask(RequestQueueStore* store,
OfflinerPolicy* policy,
......@@ -46,18 +64,18 @@ void CleanupTask::Prune(
return;
}
// Get the expired requests to be removed from the queue.
std::vector<int64_t> expired_request_ids;
GetExpiredRequestIds(std::move(requests), &expired_request_ids);
PopulateExpiredRequestIdsAndReasons(std::move(requests));
// Continue processing by handling expired requests, if any.
if (expired_request_ids.size() == 0) {
// If there are no expired requests processing is done.
if (expired_request_ids_and_reasons_.size() == 0) {
TaskComplete();
return;
}
// TODO(petewil): Add UMA saying why we remove them. Round trip the reason
// for deleting through the RQ callbacks. crbug.com/705115.
std::vector<int64_t> expired_request_ids;
for (auto const& id_reason_pair : expired_request_ids_and_reasons_)
expired_request_ids.push_back(id_reason_pair.first);
store_->RemoveRequests(expired_request_ids,
base::Bind(&CleanupTask::OnRequestsExpired,
weak_ptr_factory_.GetWeakPtr()));
......@@ -65,9 +83,17 @@ void CleanupTask::Prune(
void CleanupTask::OnRequestsExpired(
std::unique_ptr<UpdateRequestsResult> result) {
RequestNotifier::BackgroundSavePageResult save_page_result(
RequestNotifier::BackgroundSavePageResult::EXPIRED);
for (const auto& request : result->updated_items) {
// Ensure we have an expiration reason for this request.
auto iter = expired_request_ids_and_reasons_.find(request.request_id());
if (iter == expired_request_ids_and_reasons_.end()) {
NOTREACHED() << "Expired request not found in deleted results.";
continue;
}
// Establish save page result based on the expiration reason.
RequestNotifier::BackgroundSavePageResult save_page_result(
ToBackgroundSavePageResult(iter->second));
event_logger_->RecordDroppedSavePageRequest(
request.client_id().name_space, save_page_result, request.request_id());
notifier_->NotifyCompleted(request, save_page_result);
......@@ -77,9 +103,8 @@ void CleanupTask::OnRequestsExpired(
TaskComplete();
}
void CleanupTask::GetExpiredRequestIds(
std::vector<std::unique_ptr<SavePageRequest>> requests,
std::vector<int64_t>* expired_request_ids) {
void CleanupTask::PopulateExpiredRequestIdsAndReasons(
std::vector<std::unique_ptr<SavePageRequest>> requests) {
for (auto& request : requests) {
// Check for requests past their expiration time or with too many tries. If
// it is not still valid, push the request and the reason onto the deletion
......@@ -94,9 +119,7 @@ void CleanupTask::GetExpiredRequestIds(
// we call cleanup, and we shouldn't delete the request while offlining it.
if (status != OfflinerPolicyUtils::RequestExpirationStatus::VALID &&
request->request_state() != SavePageRequest::RequestState::OFFLINING) {
// TODO(petewil): Push both request and reason, will need to change type
// of list to pairs.
expired_request_ids->push_back(request->request_id());
expired_request_ids_and_reasons_.emplace(request->request_id(), status);
}
}
}
......
......@@ -5,10 +5,12 @@
#ifndef COMPONENTS_OFFLINE_PAGES_CORE_BACKGROUND_CLEANUP_TASK_H_
#define COMPONENTS_OFFLINE_PAGES_CORE_BACKGROUND_CLEANUP_TASK_H_
#include <map>
#include <memory>
#include <vector>
#include "base/memory/weak_ptr.h"
#include "components/offline_pages/core/background/offliner_policy_utils.h"
#include "components/offline_pages/core/background/request_queue_results.h"
#include "components/offline_pages/core/background/save_page_request.h"
#include "components/offline_pages/core/task.h"
......@@ -43,15 +45,19 @@ class CleanupTask : public Task {
void OnRequestsExpired(std::unique_ptr<UpdateRequestsResult> result);
// Build a list of IDs whose request has expired.
void GetExpiredRequestIds(
std::vector<std::unique_ptr<SavePageRequest>> requests,
std::vector<int64_t>* expired_request_ids);
void PopulateExpiredRequestIdsAndReasons(
std::vector<std::unique_ptr<SavePageRequest>> requests);
// Member variables, all pointers are not owned here.
RequestQueueStore* store_;
OfflinerPolicy* policy_;
RequestNotifier* notifier_;
RequestCoordinatorEventLogger* event_logger_;
// Holds a map of expired request IDs and respective expiration reasons.
std::map<int64_t, OfflinerPolicyUtils::RequestExpirationStatus>
expired_request_ids_and_reasons_;
// Allows us to pass a weak pointer to callbacks.
base::WeakPtrFactory<CleanupTask> weak_ptr_factory_;
};
......
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