report_queue_factory.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/reporting/client/report_queue_factory.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "base/callback.h"
  8. #include "base/strings/string_piece.h"
  9. #include "base/task/bind_post_task.h"
  10. #include "base/task/thread_pool.h"
  11. #include "base/threading/thread_task_runner_handle.h"
  12. #include "components/reporting/client/report_queue_configuration.h"
  13. #include "components/reporting/client/report_queue_provider.h"
  14. #include "components/reporting/util/backoff_settings.h"
  15. #include "net/base/backoff_entry.h"
  16. #define LOG_WITH_STATUS(LEVEL, MESSAGE, STATUS) \
  17. VLOG(LEVEL) << MESSAGE << " status=" << STATUS.status();
  18. namespace reporting {
  19. // static
  20. void ReportQueueFactory::Create(EventType event_type,
  21. Destination destination,
  22. SuccessCallback success_cb) {
  23. DCHECK(base::ThreadTaskRunnerHandle::IsSet());
  24. auto config_result = ReportQueueConfiguration::Create(
  25. event_type, destination,
  26. base::BindRepeating([]() { return Status::StatusOK(); }));
  27. if (!config_result.ok()) {
  28. LOG_WITH_STATUS(1, "ReportQueueConfiguration is invalid.", config_result);
  29. return;
  30. }
  31. // Asynchronously create and try to set ReportQueue.
  32. auto try_set_cb = CreateTrySetCallback(destination, std::move(success_cb),
  33. GetBackoffEntry());
  34. base::ThreadPool::PostTask(
  35. FROM_HERE, base::BindOnce(ReportQueueProvider::CreateQueue,
  36. std::move(config_result.ValueOrDie()),
  37. std::move(try_set_cb)));
  38. }
  39. // static
  40. std::unique_ptr<ReportQueue, base::OnTaskRunnerDeleter>
  41. ReportQueueFactory::CreateSpeculativeReportQueue(EventType event_type,
  42. Destination destination) {
  43. DCHECK(base::SequencedTaskRunnerHandle::IsSet());
  44. auto config_result = ReportQueueConfiguration::Create(
  45. event_type, destination,
  46. base::BindRepeating([]() { return Status::StatusOK(); }));
  47. if (!config_result.ok()) {
  48. DVLOG(1)
  49. << "Cannot initialize report queue. Invalid ReportQueueConfiguration: "
  50. << config_result.status();
  51. return std::unique_ptr<ReportQueue, base::OnTaskRunnerDeleter>(
  52. nullptr,
  53. base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get()));
  54. }
  55. auto speculative_queue_result = ReportQueueProvider::CreateSpeculativeQueue(
  56. std::move(config_result.ValueOrDie()));
  57. if (!speculative_queue_result.ok()) {
  58. DVLOG(1) << "Failed to create speculative queue: "
  59. << speculative_queue_result.status();
  60. return std::unique_ptr<ReportQueue, base::OnTaskRunnerDeleter>(
  61. nullptr,
  62. base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get()));
  63. }
  64. return std::move(speculative_queue_result.ValueOrDie());
  65. }
  66. ReportQueueFactory::TrySetReportQueueCallback
  67. ReportQueueFactory::CreateTrySetCallback(
  68. Destination destination,
  69. SuccessCallback success_cb,
  70. std::unique_ptr<::net::BackoffEntry> backoff_entry) {
  71. return base::BindPostTask(
  72. base::ThreadTaskRunnerHandle::Get(),
  73. base::BindOnce(&ReportQueueFactory::TrySetReportQueue,
  74. std::move(success_cb)));
  75. }
  76. // static
  77. void ReportQueueFactory::TrySetReportQueue(
  78. SuccessCallback success_cb,
  79. StatusOr<std::unique_ptr<ReportQueue>> report_queue_result) {
  80. if (!report_queue_result.ok()) {
  81. LOG_WITH_STATUS(1, "ReportQueue could not be created.",
  82. report_queue_result);
  83. return;
  84. }
  85. std::move(success_cb).Run(std::move(report_queue_result.ValueOrDie()));
  86. }
  87. } // namespace reporting