dout(20) << ": global_image_id=" << global_image_id << dendl;
- std::string instance_id = m_policy->lookup(global_image_id);
- assert(instance_id != Policy::UNMAPPED_INSTANCE_ID);
+ Policy::LookupInfo info = m_policy->lookup(global_image_id);
+ assert(info.instance_id != Policy::UNMAPPED_INSTANCE_ID);
- m_updates.emplace_back(global_image_id, instance_id);
+ m_updates.emplace_back(global_image_id, info.instance_id, info.mapped_time);
}
template<typename I>
dout(20) << ": global_image_id=" << global_image_id << dendl;
- std::string instance_id = m_policy->lookup(global_image_id);
- assert(instance_id != Policy::UNMAPPED_INSTANCE_ID);
+ Policy::LookupInfo info = m_policy->lookup(global_image_id);
+ assert(info.instance_id != Policy::UNMAPPED_INSTANCE_ID);
- m_acquire_updates.emplace_back(global_image_id, instance_id);
+ m_acquire_updates.emplace_back(global_image_id, info.instance_id);
}
template <typename I>
dout(20) << ": global_image_id=" << global_image_id << dendl;
- std::string instance_id = m_policy->lookup(global_image_id);
- assert(instance_id != Policy::UNMAPPED_INSTANCE_ID);
+ Policy::LookupInfo info = m_policy->lookup(global_image_id);
+ assert(info.instance_id != Policy::UNMAPPED_INSTANCE_ID);
- m_release_updates.emplace_back(global_image_id, instance_id);
+ m_release_updates.emplace_back(global_image_id, info.instance_id);
}
template <typename I>
// prepare update map
std::map<std::string, cls::rbd::MirrorImageMap> update_mapping;
for (auto const &update : updates) {
- update_mapping.emplace(update.global_image_id,
- cls::rbd::MirrorImageMap(update.instance_id, bl));
+ update_mapping.emplace(
+ update.global_image_id, cls::rbd::MirrorImageMap(update.instance_id, update.mapped_time, bl));
}
start_async_op();
schedule_remove_action(global_image_id);
}
- std::string instance_id = m_policy->lookup(global_image_id);
- if (instance_id != Policy::UNMAPPED_INSTANCE_ID) {
- to_remove.emplace_back(global_image_id, instance_id);
+ Policy::LookupInfo info = m_policy->lookup(global_image_id);
+ if (info.instance_id != Policy::UNMAPPED_INSTANCE_ID) {
+ to_remove.emplace_back(global_image_id, info.instance_id);
}
}
struct Update {
std::string global_image_id;
std::string instance_id;
+ utime_t mapped_time;
- Update(const std::string &global_image_id, const std::string &instance_id)
+ Update(const std::string &global_image_id, const std::string &instance_id,
+ utime_t mapped_time)
: global_image_id(global_image_id),
- instance_id(instance_id) {
+ instance_id(instance_id),
+ mapped_time(mapped_time) {
+ }
+ Update(const std::string &global_image_id, const std::string &instance_id)
+ : Update(global_image_id, instance_id, ceph_clock_now()) {
}
};
typedef std::list<Update> Updates;
RWLock::WLocker map_lock(m_map_lock);
for (auto const &it : image_mapping) {
- map(it.first, it.second.instance_id, utime_t(0, 0), m_map_lock);
+ map(it.first, it.second.instance_id, it.second.mapped_time, m_map_lock);
}
}
-std::string Policy::lookup(const std::string &global_image_id) {
+Policy::LookupInfo Policy::lookup(const std::string &global_image_id) {
dout(20) << ": global_image_id=" << global_image_id << dendl;
RWLock::RLocker map_lock(m_map_lock);
return r_it != it->second.actions.rend();
}
-std::string Policy::lookup(const std::string &global_image_id, const RWLock &lock) {
+Policy::LookupInfo Policy::lookup(const std::string &global_image_id, const RWLock &lock) {
assert(m_map_lock.is_locked());
+ LookupInfo info;
+
for (auto it = m_map.begin(); it != m_map.end(); ++it) {
if (it->second.find(global_image_id) != it->second.end()) {
- return it->first;
+ info.instance_id = it->first;
+ info.mapped_time = get_image_mapped_timestamp(global_image_id);
}
}
- return UNMAPPED_INSTANCE_ID;
+ return info;
}
void Policy::map(const std::string &global_image_id, const std::string &instance_id,
auto ins = m_map[instance_id].emplace(global_image_id);
assert(ins.second);
- auto it = m_actions.find(global_image_id);
- assert(it != m_actions.end());
- it->second.map_time = map_time;
+ set_image_mapped_timestamp(global_image_id, map_time);
}
void Policy::unmap(const std::string &global_image_id, const std::string &instance_id,
dout(20) << ": global_image_id=" << global_image_id << dendl;
assert(m_map_lock.is_wlocked());
- std::string instance_id = lookup(global_image_id, m_map_lock);
+ LookupInfo info = lookup(global_image_id, m_map_lock);
+ std::string instance_id = info.instance_id;
+
if (instance_id != UNMAPPED_INSTANCE_ID && !is_dead_instance(instance_id)) {
return;
}
dout(20) << ": global_image_id=" << global_image_id << dendl;
assert(m_map_lock.is_wlocked());
- std::string instance_id = lookup(global_image_id, m_map_lock);
- if (instance_id == UNMAPPED_INSTANCE_ID) {
+ LookupInfo info = lookup(global_image_id, m_map_lock);
+ if (info.instance_id == UNMAPPED_INSTANCE_ID) {
return;
}
- unmap(global_image_id, instance_id, m_map_lock);
+ unmap(global_image_id, info.instance_id, m_map_lock);
}
bool Policy::can_shuffle_image(const std::string &global_image_id) {
CephContext *cct = reinterpret_cast<CephContext *>(m_ioctx.cct());
int migration_throttle = cct->_conf->get_val<int64_t>("rbd_mirror_image_policy_migration_throttle");
- auto it = m_actions.find(global_image_id);
- assert(it != m_actions.end());
-
- utime_t last_shuffled_time = it->second.map_time;
+ utime_t last_shuffled_time = get_image_mapped_timestamp(global_image_id);
dout(10) << ": migration_throttle=" << migration_throttle << ", last_shuffled_time="
<< last_shuffled_time << dendl;
void init(const std::map<std::string, cls::rbd::MirrorImageMap> &image_mapping);
// lookup an image from the map
- std::string lookup(const std::string &global_image_id);
+ struct LookupInfo {
+ std::string instance_id = UNMAPPED_INSTANCE_ID;
+ utime_t mapped_time;
+ };
+ LookupInfo lookup(const std::string &global_image_id);
// add, remove, shuffle
bool add_image(const std::string &global_image_id,
utime_t map_time; // (re)mapped time
};
+ void set_image_mapped_timestamp(const std::string &global_image_id, utime_t time) {
+ assert(m_map_lock.is_wlocked());
+
+ auto it = m_actions.find(global_image_id);
+ assert(it != m_actions.end());
+ it->second.map_time = time;
+ }
+ utime_t get_image_mapped_timestamp(const std::string &global_image_id) {
+ assert(m_map_lock.is_locked());
+
+ auto it = m_actions.find(global_image_id);
+ assert(it != m_actions.end());
+ return it->second.map_time;
+ }
+
librados::IoCtx &m_ioctx;
std::map<std::string, ActionState> m_actions;
std::set<std::string> m_dead_instances;
bool actions_pending(const std::string &global_image_id, const RWLock &lock);
bool remove_pending(const std::string &glolbal_image_id);
- std::string lookup(const std::string &global_image_id, const RWLock &lock);
+ LookupInfo lookup(const std::string &global_image_id, const RWLock &lock);
void map(const std::string &global_image_id,
const std::string &instance_id, utime_t map_time, const RWLock &lock);
void unmap(const std::string &global_image_id, const std::string &instance_id, const RWLock &lock);