trim_history_scheduler.cc 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. #include "db/trim_history_scheduler.h"
  6. #include <cassert>
  7. #include "db/column_family.h"
  8. namespace ROCKSDB_NAMESPACE {
  9. void TrimHistoryScheduler::ScheduleWork(ColumnFamilyData* cfd) {
  10. std::lock_guard<std::mutex> lock(checking_mutex_);
  11. cfd->Ref();
  12. cfds_.push_back(cfd);
  13. is_empty_.store(false, std::memory_order_relaxed);
  14. }
  15. ColumnFamilyData* TrimHistoryScheduler::TakeNextColumnFamily() {
  16. std::lock_guard<std::mutex> lock(checking_mutex_);
  17. while (true) {
  18. if (cfds_.empty()) {
  19. return nullptr;
  20. }
  21. ColumnFamilyData* cfd = cfds_.back();
  22. cfds_.pop_back();
  23. if (cfds_.empty()) {
  24. is_empty_.store(true, std::memory_order_relaxed);
  25. }
  26. if (!cfd->IsDropped()) {
  27. // success
  28. return cfd;
  29. }
  30. cfd->UnrefAndTryDelete();
  31. }
  32. }
  33. bool TrimHistoryScheduler::Empty() {
  34. bool is_empty = is_empty_.load(std::memory_order_relaxed);
  35. return is_empty;
  36. }
  37. void TrimHistoryScheduler::Clear() {
  38. ColumnFamilyData* cfd;
  39. while ((cfd = TakeNextColumnFamily()) != nullptr) {
  40. cfd->UnrefAndTryDelete();
  41. }
  42. assert(Empty());
  43. }
  44. } // namespace ROCKSDB_NAMESPACE