From d012c381e8c59994ea9a40dc006d23f1bdd6a026 Mon Sep 17 00:00:00 2001 From: Sebastien Ponce Date: Tue, 10 May 2016 11:27:59 +0200 Subject: [PATCH] radosstriper : protect aio_write API from calls with 0 bytes an assertion was failing so far, while we only have to return without doing anything Signed-off-by: Sebastien Ponce (cherry picked from commit 7cce1e8c51640f466d8bb37a21c0d5f1b00db8ab) --- src/libradosstriper/RadosStriperImpl.cc | 56 +++++++++++++------------ 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/src/libradosstriper/RadosStriperImpl.cc b/src/libradosstriper/RadosStriperImpl.cc index 26833eab75db1..22352d9125b35 100644 --- a/src/libradosstriper/RadosStriperImpl.cc +++ b/src/libradosstriper/RadosStriperImpl.cc @@ -770,33 +770,37 @@ libradosstriper::RadosStriperImpl::internal_aio_write(const std::string& soid, uint64_t off, const ceph_file_layout& layout) { - // get list of extents to be written to - vector extents; - std::string format = soid + RADOS_OBJECT_EXTENSION_FORMAT; - file_layout_t l; - l.from_legacy(layout); - Striper::file_to_extents(cct(), format.c_str(), &l, off, len, 0, extents); - // go through the extents int r = 0; - for (vector::iterator p = extents.begin(); p != extents.end(); ++p) { - // assemble pieces of a given object into a single buffer list - bufferlist oid_bl; - for (vector >::iterator q = p->buffer_extents.begin(); - q != p->buffer_extents.end(); - ++q) { - bufferlist buffer_bl; - buffer_bl.substr_of(bl, q->first, q->second); - oid_bl.append(buffer_bl); - } - // and write the object - c->add_request(); - librados::AioCompletion *rados_completion = - m_radosCluster.aio_create_completion(c, rados_req_write_complete, rados_req_write_safe); - r = m_ioCtx.aio_write(p->oid.name, rados_completion, oid_bl, p->length, p->offset); - rados_completion->release(); - if (r < 0) - break; - } + // Do not try anything if we are called with empty buffer, + // file_to_extents would raise an exception + if (len > 0) { + // get list of extents to be written to + vector extents; + std::string format = soid + RADOS_OBJECT_EXTENSION_FORMAT; + file_layout_t l; + l.from_legacy(layout); + Striper::file_to_extents(cct(), format.c_str(), &l, off, len, 0, extents); + // go through the extents + for (vector::iterator p = extents.begin(); p != extents.end(); ++p) { + // assemble pieces of a given object into a single buffer list + bufferlist oid_bl; + for (vector >::iterator q = p->buffer_extents.begin(); + q != p->buffer_extents.end(); + ++q) { + bufferlist buffer_bl; + buffer_bl.substr_of(bl, q->first, q->second); + oid_bl.append(buffer_bl); + } + // and write the object + c->add_request(); + librados::AioCompletion *rados_completion = + m_radosCluster.aio_create_completion(c, rados_req_write_complete, rados_req_write_safe); + r = m_ioCtx.aio_write(p->oid.name, rados_completion, oid_bl, p->length, p->offset); + rados_completion->release(); + if (r < 0) + break; + } + } c->finish_adding_requests(); return r; } -- 2.39.5