Operations next() and prev() on iterator may force check is current iterator is in valid state.
However, all usages of next() perform valid() earlier, and most skip return value altogether.
Getting rid of this allows to unify KeyValueDB::IteratorImpl and KeyValueDB::WholeSpaceIteratorImpl under some basic iterator interface.
Signed-off-by: Adam Kupczyk <akupczyk@redhat.com>
virtual int upper_bound(const std::string &after) = 0;
virtual int lower_bound(const std::string &to) = 0;
virtual bool valid() = 0;
- virtual int next(bool validate=true) = 0;
+ virtual int next() = 0;
virtual std::string key() = 0;
virtual bufferlist value() = 0;
virtual int status() = 0;
public:
virtual ~IteratorImpl() {}
virtual int seek_to_last() = 0;
- virtual int prev(bool validate=true) = 0;
+ virtual int prev() = 0;
virtual std::pair<std::string, std::string> raw_key() = 0;
virtual bufferptr value_as_ptr() {
bufferlist bl = value();
return false;
return generic_iter->raw_key_is_prefixed(prefix);
}
- // Note that next() and prev() shouldn't validate iters,
- // it's responsibility of caller to ensure they're valid.
- int next(bool validate=true) override {
- if (validate) {
- if (valid())
- return generic_iter->next();
- return status();
- } else {
- return generic_iter->next();
- }
+ int next() override {
+ return generic_iter->next();
}
-
- int prev(bool validate=true) override {
- if (validate) {
- if (valid())
- return generic_iter->prev();
- return status();
- } else {
- return generic_iter->prev();
- }
+ int prev() override {
+ return generic_iter->prev();
}
std::string key() override {
return generic_iter->key();
dbiter->Seek(slice_bound);
return dbiter->status().ok() ? 0 : -1;
}
- int next(bool validate=true) override {
+ int next() override {
if (valid()) {
dbiter->Next();
}
return dbiter->status().ok() ? 0 : -1;
}
- int prev(bool validate=true) override {
+ int prev() override {
if (valid()) {
dbiter->Prev();
}
return r;
}
-int BlueStore::OmapIteratorImpl::next(bool validate)
+int BlueStore::OmapIteratorImpl::next()
{
RWLock::RLocker l(c->lock);
if (o->onode.has_omap()) {
int upper_bound(const string &after) override;
int lower_bound(const string &to) override;
bool valid() override;
- int next(bool validate=true) override;
+ int next() override;
string key() override;
bufferlist value() override;
int status() override {
return false;
}
-int DBObjectMap::DBObjectMapIteratorImpl::next(bool validate)
+int DBObjectMap::DBObjectMapIteratorImpl::next()
{
ceph_assert(cur_iter->valid());
ceph_assert(valid());
int upper_bound(const string &after) override { return 0; }
int lower_bound(const string &to) override { return 0; }
bool valid() override { return false; }
- int next(bool validate=true) override { ceph_abort(); return 0; }
+ int next() override { ceph_abort(); return 0; }
string key() override { ceph_abort(); return ""; }
bufferlist value() override { ceph_abort(); return bufferlist(); }
int status() override { return 0; }
int upper_bound(const string &after) override;
int lower_bound(const string &to) override;
bool valid() override;
- int next(bool validate=true) override;
+ int next() override;
string key() override;
bufferlist value() override;
int status() override;
}
}
-int KStore::OmapIteratorImpl::next(bool validate)
+int KStore::OmapIteratorImpl::next()
{
RWLock::RLocker l(c->lock);
if (o->onode.omap_head) {
int upper_bound(const string &after) override;
int lower_bound(const string &to) override;
bool valid() override;
- int next(bool validate=true) override;
+ int next() override;
string key() override;
bufferlist value() override;
int status() override {
std::lock_guard<std::mutex> lock(o->omap_mutex);
return it != o->omap.end();
}
- int next(bool validate=true) override {
+ int next() override {
std::lock_guard<std::mutex> lock(o->omap_mutex);
++it;
return 0;
list<pg_log_entry_t> entries;
list<pg_log_dup_t> dups;
if (p) {
- for (p->seek_to_first(); p->valid() ; p->next(false)) {
+ for (p->seek_to_first(); p->valid() ; p->next()) {
// non-log pgmeta_oid keys are prefixed with _; skip those
if (p->key()[0] == '_')
continue;
);
ceph_assert(iter);
iter->upper_bound(start_after);
- for (num = 0; iter->valid(); ++num, iter->next(false)) {
+ for (num = 0; iter->valid(); ++num, iter->next()) {
if (num >= max_return ||
bl.length() >= cct->_conf->osd_max_omap_bytes_per_request) {
truncated = true;
for (num = 0;
iter->valid() &&
iter->key().substr(0, filter_prefix.size()) == filter_prefix;
- ++num, iter->next(false)) {
+ ++num, iter->next()) {
dout(20) << "Found key " << iter->key() << dendl;
if (num >= max_return ||
bl.length() >= cct->_conf->osd_max_omap_bytes_per_request) {
osd->store->get_omap_iterator(ch, ghobject_t(oi.soid));
ceph_assert(iter);
iter->upper_bound(cursor.omap_offset);
- for (; iter->valid(); iter->next(false)) {
+ for (; iter->valid(); iter->next()) {
++omap_keys;
encode(iter->key(), omap_data);
encode(iter->value(), omap_data);
ceph_assert(iter);
for (iter->lower_bound(progress.omap_recovered_to);
iter->valid();
- iter->next(false)) {
+ iter->next()) {
if (!out_op->omap_entries.empty() &&
((cct->_conf->osd_recovery_max_omap_entries_per_chunk > 0 &&
out_op->omap_entries.size() >= cct->_conf->osd_recovery_max_omap_entries_per_chunk) ||
{
map<string,bufferlist> r;
ObjectMap::ObjectMapIterator iter = store->get_omap_iterator(ch, hoid);
- for (iter->seek_to_first(); iter->valid(); iter->next(false)) {
+ for (iter->seek_to_first(); iter->valid(); iter->next()) {
r[iter->key()] = iter->value();
}
cout << "r: " << r << std::endl;
{
map<string,bufferlist> r;
ObjectMap::ObjectMapIterator iter = store->get_omap_iterator(ch, hoid);
- for (iter->lower_bound(string()); iter->valid(); iter->next(false)) {
+ for (iter->lower_bound(string()); iter->valid(); iter->next()) {
r[iter->key()] = iter->value();
}
cout << "r: " << r << std::endl;
ObjectMap::ObjectMapIterator p = store->get_omap_iterator(ch, oid);
if (!p)
break;
- for (p->seek_to_first(); p->valid(); p->next(false)) {
+ for (p->seek_to_first(); p->valid(); p->next()) {
if (p->key()[0] == '_')
continue;
if (p->key() == "can_rollback_to")