class FsNewHandler : public FileSystemCommandHandler
{
public:
- FsNewHandler()
- : FileSystemCommandHandler("fs new")
+ FsNewHandler(Paxos *paxos)
+ : FileSystemCommandHandler("fs new"), m_paxos(paxos)
{
}
+ bool batched_propose() override {
+ return true;
+ }
+
int handle(
Monitor *mon,
FSMap &fsmap,
map<string, cmd_vartype> &cmdmap,
std::stringstream &ss) override
{
+ assert(m_paxos->is_plugged());
+
string metadata_name;
cmd_getval(g_ceph_context, cmdmap, "metadata", metadata_name);
int64_t metadata = mon->osdmon()->osdmap.lookup_pg_pool_name(metadata_name);
return -ENOENT;
}
- string force;
- cmd_getval(g_ceph_context,cmdmap, "force", force);
+ string force_str;
+ cmd_getval(g_ceph_context,cmdmap, "force", force_str);
+ bool force = (force_str == "--force");
const pool_stat_t *stat = mon->pgservice->get_pool_stat(metadata);
if (stat) {
int64_t metadata_num_objects = stat->stats.sum.num_objects;
- if (force != "--force" && metadata_num_objects > 0) {
+ if (!force && metadata_num_objects > 0) {
ss << "pool '" << metadata_name
<< "' already contains some objects. Use an empty pool instead.";
return -EINVAL;
ss << "pool '" << data_name << "' has id 0, which CephFS does not allow. Use another pool or recreate it to get a non-zero pool id.";
return -EINVAL;
}
-
+
string fs_name;
cmd_getval(g_ceph_context, cmdmap, "fs_name", fs_name);
if (fs_name.empty()) {
// we believe we must. bailing out *after* we request the proposal is
// bad business as we could have changed the osdmon's state and ending up
// returning an error to the user.
- int r = _check_pool(mon->osdmon()->osdmap, data, false, &ss);
+ int r = _check_pool(mon->osdmon()->osdmap, data, false, force, &ss);
if (r < 0) {
return r;
}
- r = _check_pool(mon->osdmon()->osdmap, metadata, true, &ss);
+ r = _check_pool(mon->osdmon()->osdmap, metadata, true, force, &ss);
if (r < 0) {
return r;
}
+ mon->osdmon()->do_application_enable(data,
+ pg_pool_t::APPLICATION_NAME_CEPHFS);
+ mon->osdmon()->do_application_enable(metadata,
+ pg_pool_t::APPLICATION_NAME_CEPHFS);
+
// All checks passed, go ahead and create.
fsmap.create_filesystem(fs_name, metadata, data,
mon->get_quorum_con_features());
ss << "new fs with metadata pool " << metadata << " and data pool " << data;
return 0;
}
+
+private:
+ Paxos *m_paxos;
};
class SetHandler : public FileSystemCommandHandler
});
ss << "disallowed increasing the cluster size past 1";
} else {
- string confirm;
- if (!cmd_getval(g_ceph_context, cmdmap, "confirm", confirm) ||
- confirm != "--yes-i-really-mean-it") {
- ss << EXPERIMENTAL_WARNING;
- return -EPERM;
- }
fsmap.modify_filesystem(
fs->fscid,
[](std::shared_ptr<Filesystem> fs)
class AddDataPoolHandler : public FileSystemCommandHandler
{
public:
- AddDataPoolHandler()
- : FileSystemCommandHandler("fs add_data_pool")
+ AddDataPoolHandler(Paxos *paxos)
+ : FileSystemCommandHandler("fs add_data_pool"), m_paxos(paxos)
{}
+ bool batched_propose() override {
+ return true;
+ }
+
int handle(
Monitor *mon,
FSMap &fsmap,
map<string, cmd_vartype> &cmdmap,
std::stringstream &ss) override
{
+ assert(m_paxos->is_plugged());
+
string poolname;
cmd_getval(g_ceph_context, cmdmap, "pool", poolname);
}
}
- int r = _check_pool(mon->osdmon()->osdmap, poolid, false, &ss);
+ int r = _check_pool(mon->osdmon()->osdmap, poolid, false, false, &ss);
if (r != 0) {
return r;
}
return 0;
}
+ mon->osdmon()->do_application_enable(poolid,
+ pg_pool_t::APPLICATION_NAME_CEPHFS);
+
fsmap.modify_filesystem(
fs->fscid,
[poolid](std::shared_ptr<Filesystem> fs)
return 0;
}
+
+private:
+ Paxos *m_paxos;
};
class SetDefaultHandler : public FileSystemCommandHandler
std::string legacy_prefix;
public:
- LegacyHandler(const std::string &new_prefix)
- : T()
+ template <typename... Args>
+ LegacyHandler(const std::string &new_prefix, Args&&... args)
+ : T(std::forward<Args>(args)...)
{
legacy_prefix = new_prefix;
}
};
-std::list<std::shared_ptr<FileSystemCommandHandler> > FileSystemCommandHandler::load()
+std::list<std::shared_ptr<FileSystemCommandHandler> >
+FileSystemCommandHandler::load(Paxos *paxos)
{
std::list<std::shared_ptr<FileSystemCommandHandler> > handlers;
handlers.push_back(std::make_shared<SetHandler>());
handlers.push_back(std::make_shared<LegacyHandler<SetHandler> >("mds set"));
handlers.push_back(std::make_shared<FlagSetHandler>());
- handlers.push_back(std::make_shared<AddDataPoolHandler>());
+ handlers.push_back(std::make_shared<AddDataPoolHandler>(paxos));
handlers.push_back(std::make_shared<LegacyHandler<AddDataPoolHandler> >(
- "mds add_data_pool"));
+ "mds add_data_pool", paxos));
handlers.push_back(std::make_shared<RemoveDataPoolHandler>());
handlers.push_back(std::make_shared<LegacyHandler<RemoveDataPoolHandler> >(
"mds remove_data_pool"));
handlers.push_back(std::make_shared<LegacyHandler<RemoveDataPoolHandler> >(
"mds rm_data_pool"));
- handlers.push_back(std::make_shared<FsNewHandler>());
+ handlers.push_back(std::make_shared<FsNewHandler>(paxos));
handlers.push_back(std::make_shared<RemoveFilesystemHandler>());
handlers.push_back(std::make_shared<ResetFilesystemHandler>());
OSDMap &osd_map,
const int64_t pool_id,
bool metadata,
+ bool force,
std::stringstream *ss) const
{
assert(ss != NULL);
return -EINVAL;
}
+ if (!force && !pool->application_metadata.empty() &&
+ pool->application_metadata.count(
+ pg_pool_t::APPLICATION_NAME_CEPHFS) == 0) {
+ *ss << " pool '" << pool_name << "' (id '" << pool_id
+ << "') has a non-CephFS application enabled.";
+ return -EINVAL;
+ }
+
// Nothing special about this pool, so it is permissible
return 0;
}