ReplicatedPG: clamp SPARSE_READ to object size for ec pool

Signed-off-by: Samuel Just <sjust@redhat.com>
This commit is contained in:
Samuel Just 2016-11-16 10:19:27 -08:00
parent 0e7860b1e4
commit 0cf383da07

View File

@ -4520,12 +4520,28 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
++ctx->num_read;
if (pool.info.ec_pool()) {
// translate sparse read to a normal one if not supported
ctx->pending_async_reads.push_back(
make_pair(
boost::make_tuple(op.extent.offset, op.extent.length, op.flags),
make_pair(&osd_op.outdata, new ToSparseReadResult(osd_op.outdata, op.extent.offset,
op.extent.length))));
dout(10) << " async_read (was sparse_read) noted for " << soid << dendl;
uint64_t offset = op.extent.offset;
uint64_t length = op.extent.length;
if (offset > oi.size) {
length = 0;
} else if (offset + length > oi.size) {
length = oi.size - offset;
}
if (length > 0) {
ctx->pending_async_reads.push_back(
make_pair(
boost::make_tuple(offset, length, op.flags),
make_pair(
&osd_op.outdata,
new ToSparseReadResult(
osd_op.outdata, offset,
op.extent.length /* updated by the callback */))));
dout(10) << " async_read (was sparse_read) noted for " << soid << dendl;
} else {
dout(10) << " sparse read ended up empty for " << soid << dendl;
map<uint64_t, uint64_t> extents;
::encode(extents, osd_op.outdata);
}
} else {
// read into a buffer
bufferlist bl;