JournalPlayer::~JournalPlayer() {
m_async_op_tracker.wait_for_ops();
+ {
+ Mutex::Locker locker(m_lock);
+ assert(m_fetch_object_numbers.empty());
+ }
m_replay_handler->put();
}
ObjectPlayers &object_players = m_object_players[splay_offset];
// prefetch in-order since a newer splay object could prefetch first
- while (!object_players.begin()->second->is_fetch_in_progress()) {
+ while (m_fetch_object_numbers.count(
+ object_players.begin()->second->get_object_number()) == 0) {
ObjectPlayerPtr object_player = object_players.begin()->second;
uint64_t player_object_number = object_player->get_object_number();
bool JournalPlayer::is_object_set_ready() const {
assert(m_lock.is_locked());
- if (m_watch_scheduled) {
+ if (m_watch_scheduled || !m_fetch_object_numbers.empty()) {
return false;
}
- for (auto &players : m_object_players) {
- if (players.second.begin()->second->is_fetch_in_progress()) {
- return false;
- }
- }
return true;
}
std::string oid = utils::get_object_name(m_object_oid_prefix, object_num);
+ assert(m_fetch_object_numbers.count(object_num) == 0);
+ m_fetch_object_numbers.insert(object_num);
+
ldout(m_cct, 10) << __func__ << ": " << oid << dendl;
C_Fetch *fetch_ctx = new C_Fetch(this, object_num);
ObjectPlayerPtr object_player(new ObjectPlayer(
<< ": r=" << r << dendl;
Mutex::Locker locker(m_lock);
+ assert(m_fetch_object_numbers.count(object_num) == 1);
+ m_fetch_object_numbers.erase(object_num);
+
if (r == -ENOENT) {
r = 0;
}
typedef std::map<uint64_t, ObjectPlayerPtr> ObjectPlayers;
typedef std::map<uint8_t, ObjectPlayers> SplayedObjectPlayers;
typedef std::map<uint8_t, ObjectPosition> SplayedObjectPositions;
+ typedef std::set<uint64_t> ObjectNumbers;
enum State {
STATE_INIT,
bool m_handler_notified = false;
+ ObjectNumbers m_fetch_object_numbers;
+
PrefetchSplayOffsets m_prefetch_splay_offsets;
SplayedObjectPlayers m_object_players;
uint64_t m_commit_object;
void watch(Context *on_fetch, double interval);
void unwatch();
- inline bool is_fetch_in_progress() const {
- Mutex::Locker locker(m_lock);
- return m_fetch_in_progress;
- }
-
void front(Entry *entry) const;
void pop_front();
inline bool empty() const {