unacked_invalidation_set.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright 2014 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/invalidation/impl/unacked_invalidation_set.h"
  5. #include "base/logging.h"
  6. #include "components/invalidation/public/ack_handle.h"
  7. #include "components/invalidation/public/topic_invalidation_map.h"
  8. namespace invalidation {
  9. const size_t UnackedInvalidationSet::kMaxBufferedInvalidations = 5;
  10. UnackedInvalidationSet::UnackedInvalidationSet(const Topic& topic)
  11. : topic_(topic) {}
  12. UnackedInvalidationSet::UnackedInvalidationSet(
  13. const UnackedInvalidationSet& other) = default;
  14. UnackedInvalidationSet::~UnackedInvalidationSet() = default;
  15. const Topic& UnackedInvalidationSet::topic() const {
  16. return topic_;
  17. }
  18. void UnackedInvalidationSet::Add(
  19. const Invalidation& invalidation) {
  20. SingleTopicInvalidationSet set;
  21. set.Insert(invalidation);
  22. AddSet(set);
  23. Truncate(kMaxBufferedInvalidations);
  24. }
  25. void UnackedInvalidationSet::AddSet(
  26. const SingleTopicInvalidationSet& invalidations) {
  27. invalidations_.insert(invalidations.begin(), invalidations.end());
  28. Truncate(kMaxBufferedInvalidations);
  29. }
  30. void UnackedInvalidationSet::ExportInvalidations(
  31. base::WeakPtr<AckHandler> ack_handler,
  32. scoped_refptr<base::SingleThreadTaskRunner> ack_handler_task_runner,
  33. TopicInvalidationMap* out) const {
  34. for (const Invalidation& invalidation : invalidations_) {
  35. // Copy the invalidation and set the copy's ack_handler.
  36. Invalidation invalidation_copy = invalidation;
  37. invalidation_copy.SetAckHandler(ack_handler, ack_handler_task_runner);
  38. out->Insert(invalidation_copy);
  39. }
  40. }
  41. // Removes the matching ack handle from the list.
  42. void UnackedInvalidationSet::Acknowledge(const AckHandle& handle) {
  43. [[maybe_unused]] bool handle_found = false;
  44. for (auto it = invalidations_.begin(); it != invalidations_.end(); ++it) {
  45. if (it->ack_handle().Equals(handle)) {
  46. invalidations_.erase(*it);
  47. handle_found = true;
  48. break;
  49. }
  50. }
  51. DLOG_IF(WARNING, !handle_found) << "Unrecognized to ack for topic " << topic_;
  52. }
  53. // Erase the invalidation with matching ack handle from the list. Also creates
  54. // an 'UnknownVersion' invalidation with the same ack handle and places it at
  55. // the beginning of the list. If an unknown version invalidation currently
  56. // exists, it is replaced.
  57. void UnackedInvalidationSet::Drop(const AckHandle& handle) {
  58. SingleTopicInvalidationSet::const_iterator it;
  59. for (it = invalidations_.begin(); it != invalidations_.end(); ++it) {
  60. if (it->ack_handle().Equals(handle)) {
  61. break;
  62. }
  63. }
  64. if (it == invalidations_.end()) {
  65. DLOG(WARNING) << "Unrecognized drop request for topic " << topic_;
  66. return;
  67. }
  68. Invalidation unknown_version = Invalidation::InitFromDroppedInvalidation(*it);
  69. invalidations_.erase(*it);
  70. // If an unknown version is in the list, we remove it so we can replace it.
  71. if (!invalidations_.empty() && invalidations_.begin()->is_unknown_version()) {
  72. invalidations_.erase(*invalidations_.begin());
  73. }
  74. invalidations_.insert(unknown_version);
  75. }
  76. void UnackedInvalidationSet::Truncate(size_t max_size) {
  77. DCHECK_GT(max_size, 0U);
  78. if (invalidations_.size() <= max_size) {
  79. return;
  80. }
  81. while (invalidations_.size() > max_size) {
  82. invalidations_.erase(*invalidations_.begin());
  83. }
  84. // We dropped some invalidations. We remember the fact that an unknown
  85. // amount of information has been lost by ensuring this list begins with
  86. // an UnknownVersion invalidation. We remove the oldest remaining
  87. // invalidation to make room for it.
  88. Topic topic = invalidations_.begin()->topic();
  89. invalidations_.erase(*invalidations_.begin());
  90. Invalidation unknown_version = Invalidation::InitUnknownVersion(topic);
  91. invalidations_.insert(unknown_version);
  92. }
  93. } // namespace invalidation