#include <vector>
#include <boost/algorithm/string.hpp>
-#include <boost/thread/lock_options.hpp>
-#include <boost/thread/shared_lock_guard.hpp>
#include "snapper/Log.h"
#include "snapper/LvmCache.h"
* in scope of logical volume.
*/
- boost::upgrade_lock<boost::upgrade_mutex> upg_lock(lv_mutex);
+ boost::upgrade_lock<boost::shared_mutex> upg_lock(lv_mutex);
if (!attrs.active)
{
{
- boost::upgrade_to_unique_lock<boost::upgrade_mutex> unique_lock(upg_lock);
+ boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(upg_lock);
SystemCmd cmd(LVCHANGEBIN + caps->get_ignoreactivationskip() + " -ay " + quote(vg->get_vg_name() + "/" + lv_name));
if (cmd.retcode() != 0)
* in scope of logical volume.
*/
- boost::upgrade_lock<boost::upgrade_mutex> upg_lock(lv_mutex);
+ boost::upgrade_lock<boost::shared_mutex> upg_lock(lv_mutex);
if (attrs.active)
{
{
- boost::upgrade_to_unique_lock<boost::upgrade_mutex> unique_lock(upg_lock);
+ boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(upg_lock);
SystemCmd cmd(LVCHANGEBIN " -an " + quote(vg->get_vg_name() + "/" + lv_name));
if (cmd.retcode() != 0)
}
}
- // vg shared lock
+
void
LogicalVolume::update()
{
- boost::shared_lock<boost::upgrade_mutex> shared_lock(lv_mutex);
+ boost::unique_lock<boost::shared_mutex> unique_lock(lv_mutex);
+
SystemCmd cmd(LVSBIN " --noheadings -o lv_attr,segtype,pool_lv " + quote(vg->get_vg_name() + "/" + lv_name));
- shared_lock.unlock();
if (cmd.retcode() != 0 || cmd.numLines() < 1)
{
throw LvmCacheException();
}
-
vector<string> args;
const string tmp = boost::trim_copy(cmd.getLine(0));
boost::split(args, tmp, boost::is_any_of(" \t\n"), boost::token_compress_on);
LvAttrs new_attrs(args);
- boost::unique_lock<boost::upgrade_mutex> unique_lock(lv_mutex);
-
attrs = new_attrs;
}
bool
LogicalVolume::readonly()
{
- boost::shared_lock<boost::upgrade_mutex> shared_lock(lv_mutex);
+ boost::shared_lock<boost::shared_mutex> shared_lock(lv_mutex);
return attrs.readonly;
}
bool
LogicalVolume::thin()
{
- boost::shared_lock<boost::upgrade_mutex> shared_lock(lv_mutex);
+ boost::shared_lock<boost::shared_mutex> shared_lock(lv_mutex);
return attrs.thin;
}
void
VolumeGroup::activate(const string& lv_name)
{
- boost::shared_lock<boost::upgrade_mutex> shared_lock(vg_mutex);
+ boost::shared_lock<boost::shared_mutex> shared_lock(vg_mutex);
iterator it = lv_info_map.find(lv_name);
if (it == lv_info_map.end())
void
VolumeGroup::deactivate(const string& lv_name)
{
- boost::shared_lock<boost::upgrade_mutex> shared_lock(vg_mutex);
+ boost::shared_lock<boost::shared_mutex> shared_lock(vg_mutex);
iterator it = lv_info_map.find(lv_name);
if (it == lv_info_map.end())
bool
VolumeGroup::contains(const std::string& lv_name) const
{
- boost::shared_lock<boost::upgrade_mutex> shared_lock(vg_mutex);
+ boost::shared_lock<boost::shared_mutex> shared_lock(vg_mutex);
return lv_info_map.find(lv_name) != lv_info_map.end();
}
bool
VolumeGroup::contains_thin(const string& lv_name) const
{
- boost::shared_lock<boost::upgrade_mutex> shared_lock(vg_mutex);
+ boost::shared_lock<boost::shared_mutex> shared_lock(vg_mutex);
const_iterator cit = lv_info_map.find(lv_name);
bool
- VolumeGroup::read_only(const string& lv_name) const
+ VolumeGroup::constains_read_only(const string& lv_name) const
{
- boost::shared_lock<boost::upgrade_mutex> shared_lock(vg_mutex);
+ boost::shared_lock<boost::shared_mutex> shared_lock(vg_mutex);
const_iterator cit = lv_info_map.find(lv_name);
void
VolumeGroup::create_snapshot(const string& lv_origin_name, const string& lv_snapshot_name)
{
- boost::upgrade_lock<boost::upgrade_mutex> upg_lock(vg_mutex);
+ boost::upgrade_lock<boost::shared_mutex> upg_lock(vg_mutex);
if (lv_info_map.find(lv_snapshot_name) != lv_info_map.end())
{
throw LvmCacheException();
}
- boost::upgrade_to_unique_lock<boost::upgrade_mutex> unique_lock(upg_lock);
+ boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(upg_lock);
SystemCmd cmd(LVCREATEBIN " --permission r --snapshot --name " +
quote(lv_snapshot_name) + " " + quote(vg_name + "/" + lv_origin_name));
void
VolumeGroup::add_or_update(const string& lv_name)
{
- boost::upgrade_lock<boost::upgrade_mutex> upg_lock(vg_mutex);
+ boost::upgrade_lock<boost::shared_mutex> upg_lock(vg_mutex);
iterator it = lv_info_map.find(lv_name);
if (it != lv_info_map.end())
{
- // FIXME: Is there a better way to downgrade upgrade lock?
- upg_lock.release()->unlock_upgrade_and_lock_shared();
- boost::shared_lock_guard<boost::upgrade_mutex> shared_guard(vg_mutex, boost::adopt_lock_t());
-
+ // FIXME: upgrade lock is too strict here. Should be shared_lock only
it->second->update();
}
else
LogicalVolume* p_lv = new LogicalVolume(this, lv_name, LvAttrs(args));
- boost::upgrade_to_unique_lock<boost::upgrade_mutex> unique_lock(upg_lock);
+ boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(upg_lock);
lv_info_map.insert(make_pair(lv_name, p_lv));
}
}
void
VolumeGroup::remove_lv(const string& lv_name)
{
- boost::upgrade_lock<boost::upgrade_mutex> upg_lock(vg_mutex);
+ boost::upgrade_lock<boost::shared_mutex> upg_lock(vg_mutex);
const_iterator cit = lv_info_map.find(lv_name);
}
// wait for all invidual lv cache operations under shared vg lock to finish
- boost::upgrade_to_unique_lock<boost::upgrade_mutex> unique_lock(upg_lock);
+ boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(upg_lock);
SystemCmd cmd(LVREMOVEBIN " --force " + quote(vg_name + "/" + lv_name));
if (cmd.retcode() != 0)
void
VolumeGroup::rename(const string& old_name, const string& new_name)
{
- boost::upgrade_lock<boost::upgrade_mutex> upg_lock(vg_mutex);
+ boost::upgrade_lock<boost::shared_mutex> upg_lock(vg_mutex);
const_iterator cit = lv_info_map.find(old_name);
}
// wait for all invidual lv cache operations under shared vg lock to finish
- boost::upgrade_to_unique_lock<boost::upgrade_mutex> unique_lock(upg_lock);
+ boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(upg_lock);
SystemCmd cmd(LVRENAMEBIN " " + quote(vg_name) + " " + quote(old_name) +
" " + quote(new_name));
VolumeGroup::debug(std::ostream& out) const
{
// do not allow any modifications in a whole VG
- boost::unique_lock<boost::upgrade_mutex> unique_lock(vg_mutex);
+ boost::unique_lock<boost::shared_mutex> unique_lock(vg_mutex);
for (const_iterator cit = lv_info_map.begin(); cit != lv_info_map.end(); cit++)
out << "\tLV:'" << cit->first << "':" << std::endl << "\t\t" << cit->second;
bool
- LvmCache::read_only(const string& vg_name, const string& lv_name) const
+ LvmCache::contains_read_only(const string& vg_name, const string& lv_name) const
{
const_iterator cit = vgroups.find(vg_name);
- return cit != vgroups.end() && cit->second->read_only(lv_name);
+ return cit != vgroups.end() && cit->second->constains_read_only(lv_name);
}
#include <vector>
#include <boost/noncopyable.hpp>
-#include <boost/thread.hpp>
+#include <boost/thread/shared_mutex.hpp>
LvAttrs attrs;
- mutable boost::upgrade_mutex lv_mutex;
+ mutable boost::shared_mutex lv_mutex;
};
bool contains(const string& lv_name) const; // shared lock
bool contains_thin(const string& lv_name) const; // shared lock
- bool read_only(const string& lv_name) const; // shared lock
+ bool constains_read_only(const string& lv_name) const; // shared lock
void create_snapshot(const string& lv_origin_name, const string& lv_snapshot_name); // upg lock -> excl
void add_or_update(const string& lv_name); // upg lock -> excl
const string vg_name;
- mutable boost::upgrade_mutex vg_mutex;
+ mutable boost::shared_mutex vg_mutex;
vg_content_t lv_info_map;
};
bool contains(const string& vg_name, const string& lv_name) const;
bool contains_thin(const string& vg_name, const string& lv_name) const;
- bool read_only(const string& vg_name, const string& lv_name) const;
+ bool contains_read_only(const string& vg_name, const string& lv_name) const;
// create snapper owned snapshot
void create_snapshot(const string& vg_name, const string&lv_origin_name, const string& lv_snapshot_name);