"rename <srcpool> to <destpool>", "osd", "rw", "cli,rest")
COMMAND("osd pool get " \
"name=pool,type=CephPoolname " \
- "name=var,type=CephChoices,strings=size|min_size|crash_replay_interval|pg_num|pgp_num|crush_ruleset|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|auid|target_max_objects|target_max_bytes|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|erasure_code_profile|min_read_recency_for_promote|write_fadvise_dontneed|all|min_write_recency_for_promote", \
+ "name=var,type=CephChoices,strings=size|min_size|crash_replay_interval|pg_num|pgp_num|crush_ruleset|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|auid|target_max_objects|target_max_bytes|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|erasure_code_profile|min_read_recency_for_promote|write_fadvise_dontneed|all|min_write_recency_for_promote|fast_read", \
"get pool parameter <var>", "osd", "r", "cli,rest")
COMMAND("osd pool set " \
"name=pool,type=CephPoolname " \
- "name=var,type=CephChoices,strings=size|min_size|crash_replay_interval|pg_num|pgp_num|crush_ruleset|hashpspool|nodelete|nopgchange|nosizechange|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|debug_fake_ec_pool|target_max_bytes|target_max_objects|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|auid|min_read_recency_for_promote|write_fadvise_dontneed|min_write_recency_for_promote " \
+ "name=var,type=CephChoices,strings=size|min_size|crash_replay_interval|pg_num|pgp_num|crush_ruleset|hashpspool|nodelete|nopgchange|nosizechange|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|debug_fake_ec_pool|target_max_bytes|target_max_objects|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|auid|min_read_recency_for_promote|write_fadvise_dontneed|min_write_recency_for_promote|fast_read " \
"name=val,type=CephString " \
"name=force,type=CephChoices,strings=--yes-i-really-mean-it,req=false", \
"set pool parameter <var> to <val>", "osd", "rw", "cli,rest")
CACHE_TARGET_FULL_RATIO,
CACHE_MIN_FLUSH_AGE, CACHE_MIN_EVICT_AGE,
ERASURE_CODE_PROFILE, MIN_READ_RECENCY_FOR_PROMOTE,
- WRITE_FADVISE_DONTNEED, MIN_WRITE_RECENCY_FOR_PROMOTE};
+ WRITE_FADVISE_DONTNEED, MIN_WRITE_RECENCY_FOR_PROMOTE,
+ FAST_READ};
std::set<osd_pool_get_choices>
subtract_second_from_first(const std::set<osd_pool_get_choices>& first,
("erasure_code_profile", ERASURE_CODE_PROFILE)
("min_read_recency_for_promote", MIN_READ_RECENCY_FOR_PROMOTE)
("write_fadvise_dontneed", WRITE_FADVISE_DONTNEED)
- ("min_write_recency_for_promote", MIN_WRITE_RECENCY_FOR_PROMOTE);
+ ("min_write_recency_for_promote", MIN_WRITE_RECENCY_FOR_PROMOTE)
+ ("fast_read", FAST_READ);
typedef std::set<osd_pool_get_choices> choices_set_t;
f->dump_int("min_write_recency_for_promote",
p->min_write_recency_for_promote);
break;
+ case FAST_READ:
+ f->dump_int("fast_read", p->fast_read);
+ break;
}
f->close_section();
f->flush(rdata);
ss << "min_write_recency_for_promote: " <<
p->min_write_recency_for_promote << "\n";
break;
+ case FAST_READ:
+ ss << "fast_read: " << p->fast_read << "\n";
+ break;
}
rdata.append(ss.str());
ss.str("");
return -EINVAL;
}
p.min_write_recency_for_promote = n;
+ } else if (var == "fast_read") {
+ if (val == "true" || (interr.empty() && n == 1)) {
+ if (p.is_replicated()) {
+ ss << "fast read is not supported in replication pool";
+ return -EINVAL;
+ }
+ p.fast_read = true;
+ } else if (val == "false" || (interr.empty() && n == 0)) {
+ p.fast_read = false;
+ }
} else {
ss << "unrecognized variable '" << var << "'";
return -EINVAL;
pg->pgbackend->objects_read_async(
obc->obs.oi.soid,
pending_async_reads,
- new OnReadComplete(pg, this));
+ new OnReadComplete(pg, this), pg->get_pool().fast_read);
pending_async_reads.clear();
}
void ReplicatedPG::OpContext::finish_read(ReplicatedPG *pg)
f->dump_unsigned("min_write_recency_for_promote", min_write_recency_for_promote);
f->dump_unsigned("stripe_width", get_stripe_width());
f->dump_unsigned("expected_num_objects", expected_num_objects);
+ f->dump_bool("fast_read", fast_read);
}
void pg_pool_t::convert_to_pg_shards(const vector<int> &from, set<pg_shard_t>* to) const {
return;
}
- ENCODE_START(21, 5, bl);
+ ENCODE_START(22, 5, bl);
::encode(type, bl);
::encode(size, bl);
::encode(crush_ruleset, bl);
::encode(cache_target_dirty_high_ratio_micro, bl);
::encode(min_write_recency_for_promote, bl);
::encode(use_gmt_hitset, bl);
+ ::encode(fast_read, bl);
ENCODE_FINISH(bl);
}
void pg_pool_t::decode(bufferlist::iterator& bl)
{
- DECODE_START_LEGACY_COMPAT_LEN(21, 5, 5, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(22, 5, 5, bl);
::decode(type, bl);
::decode(size, bl);
::decode(crush_ruleset, bl);
} else {
use_gmt_hitset = false;
}
+ if (struct_v >= 22) {
+ ::decode(fast_read, bl);
+ } else {
+ fast_read = false;
+ }
DECODE_FINISH(bl);
calc_pg_masks();
}
a.cache_min_evict_age = 2321;
a.erasure_code_profile = "profile in osdmap";
a.expected_num_objects = 123456;
+ a.fast_read = false;
o.push_back(new pg_pool_t(a));
}
out << " stripe_width " << p.get_stripe_width();
if (p.expected_num_objects)
out << " expected_num_objects " << p.expected_num_objects;
+ if (p.fast_read)
+ out << " fast_read " << p.fast_read;
return out;
}
uint64_t expected_num_objects; ///< expected number of objects on this pool, a value of 0 indicates
///< user does not specify any expected value
+ bool fast_read; ///< whether turn on fast read on the pool or not
pg_pool_t()
: flags(0), type(0), size(0), min_size(0),
min_read_recency_for_promote(0),
min_write_recency_for_promote(0),
stripe_width(0),
- expected_num_objects(0)
+ expected_num_objects(0),
+ fast_read(false)
{ }
void dump(Formatter *f) const;
self.assert_valid_command(['osd', 'crush', 'dump'])
assert_equal({}, validate_command(sigdict, ['osd', 'crush']))
assert_equal({}, validate_command(sigdict, ['osd', 'crush',
- 'dump',
+ 'dump',
'toomany']))
def test_setcrushmap(self):
assert_equal({}, validate_command(sigdict, ['osd', 'pool', 'create',
'poolname',
'128', '128',
- 'erasure', '^^^',
+ 'erasure', '^^^',
'ruleset']))
assert_equal({}, validate_command(sigdict, ['osd', 'pool', 'create',
'poolname',
def test_pool_get(self):
for var in ('size', 'min_size', 'crash_replay_interval',
- 'pg_num', 'pgp_num', 'crush_ruleset', 'auid'):
+ 'pg_num', 'pgp_num', 'crush_ruleset', 'auid', 'fast_read'):
self.assert_valid_command(['osd', 'pool', 'get', 'poolname', var])
assert_equal({}, validate_command(sigdict, ['osd', 'pool']))
assert_equal({}, validate_command(sigdict, ['osd', 'pool',
def test_pool_set(self):
for var in ('size', 'min_size', 'crash_replay_interval',
'pg_num', 'pgp_num', 'crush_ruleset',
- 'hashpspool', 'auid'):
+ 'hashpspool', 'auid', 'fast_read'):
self.assert_valid_command(['osd', 'pool',
'set', 'poolname', var, 'value'])
assert_equal({}, validate_command(sigdict, ['osd', 'pool',
def test_list(self):
self.check_no_arg('config-key', 'list')
# Local Variables:
-# compile-command: "cd ../.. ; make -j4 &&
+# compile-command: "cd ../.. ; make -j4 &&
# PYTHONPATH=pybind nosetests --stop \
# test/pybind/test_ceph_argparse.py # test_ceph_argparse.py:TestOSD.test_rm"
# End: