Skip to content

Commit

Permalink
Merge pull request #7513 from athanatos/wip-ceph-test-rados-2
Browse files Browse the repository at this point in the history
ceph_test_rados: use less CPU
  • Loading branch information
liewegas committed Feb 8, 2016
2 parents 6a8cafe + 31649e5 commit 3f66231
Show file tree
Hide file tree
Showing 3 changed files with 256 additions and 140 deletions.
183 changes: 83 additions & 100 deletions src/test/osd/Object.cc
Expand Up @@ -82,68 +82,44 @@ void VarLenGenerator::get_ranges_map(
}
}

ObjectDesc::iterator &ObjectDesc::iterator::advance(bool init) {
assert(pos < limit);
assert(!end());
if (!init) {
pos++;
}
if (end()) {
return *this;
}
while (pos == limit) {
cur_cont = stack.begin()->first;
limit = stack.begin()->second;
void ObjectDesc::iterator::adjust_stack() {
while (!stack.empty() && pos >= stack.front().second.next) {
assert(pos == stack.front().second.next);
size = stack.front().second.size;
current = stack.front().first;
stack.pop_front();
}

if (cur_cont == obj.layers.end()) {
return *this;
if (stack.empty()) {
cur_valid_till = std::numeric_limits<uint64_t>::max();
} else {
cur_valid_till = stack.front().second.next;
}

interval_set<uint64_t> ranges;
cur_cont->first->get_ranges(cur_cont->second, ranges);
while (!ranges.contains(pos)) {
stack.push_front(std::pair<std::list<std::pair<ceph::shared_ptr<ContentsGenerator>,
ContDesc> >::iterator,
uint64_t>(cur_cont, limit));
uint64_t length = cur_cont->first->get_length(cur_cont->second);
uint64_t next;
if (pos >= length) {
next = limit;
cur_cont = obj.layers.end();
} else if (ranges.empty() || pos >= ranges.range_end()) {
next = length;
++cur_cont;
} else {
next = ranges.start_after(pos);
++cur_cont;
}
if (next < limit) {
limit = next;
while (current != layers.end() && !current->covers(pos)) {
uint64_t next = current->next(pos);
if (next < cur_valid_till) {
stack.push_front(
make_pair(
current,
StackState{next, size}
)
);
cur_valid_till = next;
}
if (cur_cont == obj.layers.end()) {
break;
}

ranges.clear();
cur_cont->first->get_ranges(cur_cont->second, ranges);
}

if (cur_cont == obj.layers.end()) {
return *this;
++current;
}

if (!cont_iters.count(cur_cont->second)) {
cont_iters.insert(std::pair<ContDesc,ContentsGenerator::iterator>(
cur_cont->second,
cur_cont->first->get_iterator(cur_cont->second)));
if (current == layers.end()) {
size = 0;
} else {
current->iter.seek(pos);
size = std::min(size, current->get_size());
cur_valid_till = std::min(
current->valid_till(pos),
cur_valid_till);
}
std::map<ContDesc,ContentsGenerator::iterator>::iterator j = cont_iters.find(
cur_cont->second);
assert(j != cont_iters.end());
j->second.seek(pos);
return *this;
}

const ContDesc &ObjectDesc::most_recent() {
Expand All @@ -156,68 +132,75 @@ void ObjectDesc::update(ContentsGenerator *gen, const ContDesc &next) {
}

bool ObjectDesc::check(bufferlist &to_check) {
iterator i = begin();
uint64_t pos = 0;
for (bufferlist::iterator p = to_check.begin();
!p.end();
++p, ++i, ++pos) {
if (i.end()) {
std::cout << "reached end of iterator first" << std::endl;
return false;
}
if (*i != *p) {
std::cout << "incorrect buffer at pos " << pos << std::endl;
return false;
}
iterator objiter = begin();
uint64_t error_at = 0;
if (!objiter.check_bl_advance(to_check, &error_at)) {
std::cout << "incorrect buffer at pos " << error_at << std::endl;
return false;
}
uint64_t size = layers.empty() ? 0 :
most_recent_gen()->get_length(most_recent());
if (pos != size) {
std::cout << "only read " << pos << " out of size " << size << std::endl;

uint64_t size = layers.begin()->first->get_length(layers.begin()->second);
if (to_check.length() < size) {
std::cout << "only read " << to_check.length()
<< " out of size " << size << std::endl;
return false;
}
return true;
}

bool ObjectDesc::check_sparse(const std::map<uint64_t, uint64_t>& extents,
bufferlist &to_check) {
auto i = begin();
auto p = to_check.begin();
bufferlist &to_check)
{
uint64_t off = 0;
uint64_t pos = 0;
for (auto extent : extents) {
const uint64_t start = extent.first;
const uint64_t end = start + extent.second;
for (; pos < end; ++i, ++pos) {
if (i.end()) {
std::cout << "reached end of iterator first" << std::endl;
auto objiter = begin();
for (auto &&extiter : extents) {
// verify hole
{
bufferlist bl;
bl.append_zero(extiter.first - pos);
uint64_t error_at = 0;
if (!objiter.check_bl_advance(bl, &error_at)) {
std::cout << "sparse read omitted non-zero data at "
<< error_at << std::endl;
return false;
}
if (pos < start) {
// check the hole
if (*i != '\0') {
std::cout << "incorrect buffer at pos " << pos << std::endl;
return false;
}
} else {
// then the extent
if (*i != *p) {
std::cout << "incorrect buffer at pos " << pos << std::endl;
return false;
}
++p;
}

assert(off <= to_check.length());
pos = extiter.first;
objiter.seek(pos);

{
bufferlist bl;
bl.substr_of(
to_check,
off,
std::min(to_check.length() - off, extiter.second));
uint64_t error_at = 0;
if (!objiter.check_bl_advance(bl, &error_at)) {
std::cout << "incorrect buffer at pos " << error_at << std::endl;
return false;
}
off += extiter.second;
pos += extiter.second;
}
}
uint64_t size = layers.empty() ? 0 :
most_recent_gen()->get_length(most_recent());
while (pos < size) {
if (*i != '\0') {
std::cout << "sparse read omitted non-zero data at " << pos << std::endl;

if (pos < extiter.first + extiter.second) {
std::cout << "reached end of iterator first" << std::endl;
return false;
}
++i;
++pos;
}
assert(pos == size);

// final hole
bufferlist bl;
uint64_t size = layers.begin()->first->get_length(layers.begin()->second);
bl.append_zero(size - pos);
uint64_t error_at;
if (!objiter.check_bl_advance(bl, &error_at)) {
std::cout << "sparse read omitted non-zero data at "
<< error_at << std::endl;
return false;
}
return true;
}

0 comments on commit 3f66231

Please sign in to comment.