This is cleaner. All users are currently standalone tests; updated.
It also means that *all* commands that have a name=pgid arg are pg tell
commands.
Signed-off-by: Sage Weil <sage@redhat.com>
do
primary=$(ceph pg dump pgs --format=json | jq ".pg_stats[] | select(.pgid == $qpg) | .acting_primary")
eval pg=$qpg # strip quotes around qpg
- CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pg
+ ceph tell $pg scrub
done
ceph pg dump pgs
local pgid=$(get_pg $poolname SOMETHING)
local primary=$(get_primary $poolname SOMETHING)
local last_scrub_stamp="$(get_last_scrub_stamp $pgid)"
- CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_deep_scrub $pgid
- CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pgid
+ ceph tell $pgid deep_scrub
+ ceph tell $pgid scrub
# Wait for auto repair
wait_for_scrub $pgid "$last_scrub_stamp" || return 1
local pgid=$(get_pg $poolname SOMETHING)
local primary=$(get_primary $poolname SOMETHING)
local last_scrub_stamp="$(get_last_scrub_stamp $pgid)"
- CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pgid
+ ceph tell $pgid scrub
# Wait for scrub -> auto repair
wait_for_scrub $pgid "$last_scrub_stamp" || return 1
local pgid=$(get_pg $poolname obj1)
local primary=$(get_primary $poolname obj1)
local last_scrub_stamp="$(get_last_scrub_stamp $pgid)"
- CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_deep_scrub $pgid
- CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pgid
+ ceph tell $pgid deep_scrub
+ ceph tell $pgid scrub
# Wait for auto repair
wait_for_scrub $pgid "$last_scrub_stamp" || return 1
local pgid=$(get_pg $poolname obj1)
local primary=$(get_primary $poolname obj1)
local last_scrub_stamp="$(get_last_scrub_stamp $pgid)"
- CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_deep_scrub $pgid
- CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pgid
+ ceph tell $pgid deep_scrub
+ ceph tell $pgid scrub
# Wait for auto repair
wait_for_scrub $pgid "$last_scrub_stamp" || return 1
flush_pg_stats
local last_scrub=$(get_last_scrub_stamp $pg)
# Fake a schedule scrub
- CEPH_ARGS='' ceph --admin-daemon $(get_asok_path osd.${primary}) \
- trigger_scrub $pg || return 1
+ ceph tell $pg scrub || return 1
# Wait for schedule regular scrub
wait_for_scrub $pg "$last_scrub"
sleep 5
# Fake a schedule scrub
- CEPH_ARGS='' ceph --admin-daemon $(get_asok_path osd.${primary}) \
- trigger_scrub $pg || return 1
+ ceph tell $pg scrub || return 1
# Wait for schedule regular scrub
# to notice scrub and skip it
local found=false
else
overdue_seconds=$conf_overdue_seconds
fi
- CEPH_ARGS='' ceph daemon $(get_asok_path osd.${primary}) \
- trigger_scrub ${i}.0 $(expr ${overdue_seconds} + ${i}00) || return 1
+ ceph tell ${i}.0 scrub $(expr ${overdue_seconds} + ${i}00) || return 1
done
# Fake schedule deep scrubs
for i in $(seq $(expr $scrubs + 1) $(expr $scrubs + $deep_scrubs))
else
overdue_seconds=$conf_overdue_seconds
fi
- CEPH_ARGS='' ceph daemon $(get_asok_path osd.${primary}) \
- trigger_deep_scrub ${i}.0 $(expr ${overdue_seconds} + ${i}00) || return 1
+ ceph tell ${i}.0 deep_scrub $(expr ${overdue_seconds} + ${i}00) || return 1
done
flush_pg_stats
otherpgs="${otherpgs}${opg} "
local other_last_scrub=$(get_last_scrub_stamp $pg)
# Fake a schedule scrub
- CEPH_ARGS='' ceph --admin-daemon $(get_asok_path osd.${primary}) \
- trigger_scrub $opg || return 1
+ ceph tell $opg scrub $opg || return 1
done
sleep 15
local pgid=$(get_pg $poolname SOMETHING)
local primary=$(get_primary $poolname SOMETHING)
local last_scrub=$(get_last_scrub_stamp $pgid)
- CEPH_ARGS='' ceph daemon $(get_asok_path osd.$primary) trigger_scrub $pgid || return 1
+ ceph tell $pgid scrub || return 1
# Due to the long delay, the scrub should not be done within 3 seconds
for ((i=0; i < 3; i++)); do
if (prefix == "pg" ||
prefix == "query" ||
prefix == "mark_unfound_lost" ||
- prefix == "list_unfound"
+ prefix == "list_unfound" ||
+ prefix == "scrub" ||
+ prefix == "deep_scrub"
) {
string pgidstr;
pg_t pgid;
test_ops_hook,
"Delay osd recovery by specified seconds");
ceph_assert(r == 0);
- r = admin_socket->register_command(
- "trigger_scrub " \
- "name=pgid,type=CephString " \
- "name=time,type=CephInt,req=false",
- test_ops_hook,
- "Trigger a scheduled scrub ");
- ceph_assert(r == 0);
- r = admin_socket->register_command(
- "trigger_deep_scrub " \
- "name=pgid,type=CephString " \
- "name=time,type=CephInt,req=false",
- test_ops_hook,
- "Trigger a scheduled deep scrub ");
- ceph_assert(r == 0);
r = admin_socket->register_command(
"injectfull " \
"name=type,type=CephString,req=false " \
asok_hook,
"");
ceph_assert(r == 0);
+ r = admin_socket->register_command(
+ "pg " \
+ "name=pgid,type=CephPgid " \
+ "name=cmd,type=CephChoices,strings=scrub " \
+ "name=time,type=CephInt,req=false",
+ asok_hook,
+ "");
+ ceph_assert(r == 0);
+ r = admin_socket->register_command(
+ "pg " \
+ "name=pgid,type=CephPgid " \
+ "name=cmd,type=CephChoices,strings=deep_scrub " \
+ "name=time,type=CephInt,req=false",
+ asok_hook,
+ "");
+ ceph_assert(r == 0);
// new form: tell <pgid> <cmd> for both cli and rest
r = admin_socket->register_command(
"query",
asok_hook,
"list unfound objects on this pg, perhaps starting at an offset given in JSON");
ceph_assert(r == 0);
+ r = admin_socket->register_command(
+ "scrub " \
+ "name=pgid,type=CephPgid,req=false " \
+ "name=time,type=CephInt,req=false",
+ asok_hook,
+ "Trigger a scheduled scrub ");
+ ceph_assert(r == 0);
+ r = admin_socket->register_command(
+ "deep_scrub " \
+ "name=pgid,type=CephPgid,req=false " \
+ "name=time,type=CephInt,req=false",
+ asok_hook,
+ "Trigger a scheduled deep scrub ");
+ ceph_assert(r == 0);
}
void OSD::create_logger()
<< "to " << service->cct->_conf->osd_recovery_delay_start;
return;
}
- if (command == "trigger_scrub" || command == "trigger_deep_scrub") {
- spg_t pgid;
- bool deep = (command == "trigger_deep_scrub");
- OSDMapRef curmap = service->get_osdmap();
-
- string pgidstr;
-
- cmd_getval(service->cct, cmdmap, "pgid", pgidstr);
- if (!pgid.parse(pgidstr.c_str())) {
- ss << "Invalid pgid specified";
- return;
- }
-
- int64_t time;
- cmd_getval(service->cct, cmdmap, "time", time, (int64_t)0);
-
- PGRef pg = service->osd->_lookup_lock_pg(pgid);
- if (pg == nullptr) {
- ss << "Can't find pg " << pgid;
- return;
- }
-
- if (pg->is_primary()) {
- const pg_pool_t *p = curmap->get_pg_pool(pgid.pool());
- double pool_scrub_max_interval = 0;
- double scrub_max_interval;
- if (deep) {
- p->opts.get(pool_opts_t::DEEP_SCRUB_INTERVAL, &pool_scrub_max_interval);
- scrub_max_interval = pool_scrub_max_interval > 0 ?
- pool_scrub_max_interval : g_conf()->osd_deep_scrub_interval;
- } else {
- p->opts.get(pool_opts_t::SCRUB_MAX_INTERVAL, &pool_scrub_max_interval);
- scrub_max_interval = pool_scrub_max_interval > 0 ?
- pool_scrub_max_interval : g_conf()->osd_scrub_max_interval;
- }
- // Instead of marking must_scrub force a schedule scrub
- utime_t stamp = ceph_clock_now();
- if (time == 0)
- stamp -= scrub_max_interval;
- else
- stamp -= (float)time;
- stamp -= 100.0; // push back last scrub more for good measure
- if (deep) {
- pg->set_last_deep_scrub_stamp(stamp);
- } else {
- pg->set_last_scrub_stamp(stamp);
- }
- ss << "ok - set" << (deep ? " deep" : "" ) << " stamp " << stamp;
- } else {
- ss << "Not primary";
- }
- pg->unlock();
- return;
- }
if (command == "injectfull") {
int64_t count;
string type;
f->close_section();
}
+ else if (prefix == "scrub" ||
+ prefix == "deep_scrub") {
+ bool deep = (prefix == "deep_scrub");
+ int64_t time;
+ cmd_getval(cct, cmdmap, "time", time, (int64_t)0);
+
+ if (is_primary()) {
+ const pg_pool_t *p = &pool.info;
+ double pool_scrub_max_interval = 0;
+ double scrub_max_interval;
+ if (deep) {
+ p->opts.get(pool_opts_t::DEEP_SCRUB_INTERVAL, &pool_scrub_max_interval);
+ scrub_max_interval = pool_scrub_max_interval > 0 ?
+ pool_scrub_max_interval : g_conf()->osd_deep_scrub_interval;
+ } else {
+ p->opts.get(pool_opts_t::SCRUB_MAX_INTERVAL, &pool_scrub_max_interval);
+ scrub_max_interval = pool_scrub_max_interval > 0 ?
+ pool_scrub_max_interval : g_conf()->osd_scrub_max_interval;
+ }
+ // Instead of marking must_scrub force a schedule scrub
+ utime_t stamp = ceph_clock_now();
+ if (time == 0)
+ stamp -= scrub_max_interval;
+ else
+ stamp -= (float)time;
+ stamp -= 100.0; // push back last scrub more for good measure
+ if (deep) {
+ set_last_deep_scrub_stamp(stamp);
+ } else {
+ set_last_scrub_stamp(stamp);
+ }
+ f->open_object_section("result");
+ f->dump_bool("deep", deep);
+ f->dump_stream("stamp") << stamp;
+ f->close_section();
+ } else {
+ ss << "Not primary";
+ ret = -EPERM;
+ }
+ outbl.append(ss.str());
+ }
+
else {
ret = -ENOSYS;
ss << "prefix '" << prefix << "' not implemented";