#pragma once #include #include #include "common/status.h" #include "ray/common/id.h" namespace ray { namespace streaming { class StreamingBarrierHelper { using BarrierIdQueue = std::shared_ptr>; private: // Global barrier map set (global barrier id -> (channel id -> msg id)) std::unordered_map> global_barrier_map_; // Message id map to barrier id of each queue(continuous barriers hold same last message // id) // message id -> (queue id -> list(barrier id)). // Thread unsafe to assign value in user's thread but collect it in loopforward thread. std::unordered_map> global_reversed_barrier_map_; std::unordered_map barrier_checkpoint_map_; std::unordered_map max_message_id_map_; // We assume default max checkpoint is 0. std::unordered_map current_max_checkpoint_id_map_; std::mutex message_id_map_barrier_mutex_; std::mutex global_barrier_mutex_; std::mutex barrier_map_checkpoint_mutex_; public: StreamingStatus GetMsgIdByBarrierId(const ObjectID &q_id, uint64_t barrier_id, uint64_t &msg_id); void SetMsgIdByBarrierId(const ObjectID &q_id, uint64_t barrier_id, uint64_t seq_id); bool Contains(uint64_t barrier_id); void ReleaseBarrierMapById(uint64_t barrier_id); void ReleaseAllBarrierMap(); void GetAllBarrier(std::vector &barrier_id_vec); uint32_t GetBarrierMapSize(); void MapBarrierToCheckpoint(uint64_t barrier_id, uint64_t checkpoint); StreamingStatus GetCheckpointIdByBarrierId(uint64_t barrier_id, uint64_t &checkpoint_id); void ReleaseBarrierMapCheckpointByBarrierId(const uint64_t barrier_id); StreamingStatus GetBarrierIdByLastMessageId(const ObjectID &q_id, uint64_t message_id, uint64_t &barrier_id, bool is_pop = false); void SetBarrierIdByLastMessageId(const ObjectID &q_id, uint64_t message_id, uint64_t barrier_id); void GetCurrentMaxCheckpointIdInQueue(const ObjectID &q_id, uint64_t &checkpoint_id) const; void SetCurrentMaxCheckpointIdInQueue(const ObjectID &q_id, const uint64_t checkpoint_id); }; } // namespace streaming } // namespace ray