offpeak_time_info.cc 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Copyright (c) Meta Platforms, Inc. and affiliates.
  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 "options/offpeak_time_info.h"
  6. #include "rocksdb/system_clock.h"
  7. #include "util/string_util.h"
  8. namespace ROCKSDB_NAMESPACE {
  9. OffpeakTimeOption::OffpeakTimeOption() : OffpeakTimeOption("") {}
  10. OffpeakTimeOption::OffpeakTimeOption(const std::string& offpeak_time_string) {
  11. SetFromOffpeakTimeString(offpeak_time_string);
  12. }
  13. void OffpeakTimeOption::SetFromOffpeakTimeString(
  14. const std::string& offpeak_time_string) {
  15. const int old_start_time = daily_offpeak_start_time_utc;
  16. const int old_end_time = daily_offpeak_end_time_utc;
  17. if (TryParseTimeRangeString(offpeak_time_string, daily_offpeak_start_time_utc,
  18. daily_offpeak_end_time_utc)) {
  19. daily_offpeak_time_utc = offpeak_time_string;
  20. } else {
  21. daily_offpeak_start_time_utc = old_start_time;
  22. daily_offpeak_end_time_utc = old_end_time;
  23. }
  24. }
  25. OffpeakTimeInfo OffpeakTimeOption::GetOffpeakTimeInfo(
  26. const int64_t& current_time) const {
  27. OffpeakTimeInfo offpeak_time_info;
  28. if (daily_offpeak_start_time_utc == daily_offpeak_end_time_utc) {
  29. return offpeak_time_info;
  30. }
  31. int seconds_since_midnight = static_cast<int>(current_time % kSecondsPerDay);
  32. int seconds_since_midnight_to_nearest_minute =
  33. (seconds_since_midnight / kSecondsPerMinute) * kSecondsPerMinute;
  34. // if the offpeak duration spans overnight (i.e. 23:30 - 4:30 next day)
  35. if (daily_offpeak_start_time_utc > daily_offpeak_end_time_utc) {
  36. offpeak_time_info.is_now_offpeak =
  37. daily_offpeak_start_time_utc <=
  38. seconds_since_midnight_to_nearest_minute ||
  39. seconds_since_midnight_to_nearest_minute <= daily_offpeak_end_time_utc;
  40. } else {
  41. offpeak_time_info.is_now_offpeak =
  42. daily_offpeak_start_time_utc <=
  43. seconds_since_midnight_to_nearest_minute &&
  44. seconds_since_midnight_to_nearest_minute <= daily_offpeak_end_time_utc;
  45. }
  46. offpeak_time_info.seconds_till_next_offpeak_start =
  47. seconds_since_midnight < daily_offpeak_start_time_utc
  48. ? daily_offpeak_start_time_utc - seconds_since_midnight
  49. : ((daily_offpeak_start_time_utc + kSecondsPerDay) -
  50. seconds_since_midnight);
  51. return offpeak_time_info;
  52. }
  53. } // namespace ROCKSDB_NAMESPACE