From: shawn Date: Fri, 11 Dec 2015 08:47:27 +0000 (-0500) Subject: rados: implement radosstripper force remove when full. X-Git-Tag: v10.0.3~219^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=54a6ba8c4b2be6dd7ffd4ea95ccb13ade771cced;p=ceph.git rados: implement radosstripper force remove when full. extend libradosstripper remove interface and rados tool rm force-full when use_stripper. Signed-off-by: Xiaowei Chen --- diff --git a/src/include/radosstriper/libradosstriper.hpp b/src/include/radosstriper/libradosstriper.hpp index 05179ffbc658..6352d581e3b5 100644 --- a/src/include/radosstriper/libradosstriper.hpp +++ b/src/include/radosstriper/libradosstriper.hpp @@ -190,7 +190,7 @@ namespace libradosstriper * during deletion (same EBUSY return code) */ int remove(const std::string& soid); - + int remove(const std::string& soid, int flags); /** * Resizes a striped object * the truncation can not happen if any I/O is ongoing (it diff --git a/src/libradosstriper/RadosStriperImpl.cc b/src/libradosstriper/RadosStriperImpl.cc index 3544cac1b787..e9b3bd5fa59a 100644 --- a/src/libradosstriper/RadosStriperImpl.cc +++ b/src/libradosstriper/RadosStriperImpl.cc @@ -550,7 +550,7 @@ int libradosstriper::RadosStriperImpl::stat(const std::string& soid, uint64_t *p return 0; } -int libradosstriper::RadosStriperImpl::remove(const std::string& soid) +int libradosstriper::RadosStriperImpl::remove(const std::string& soid, int flags) { std::string firstObjOid = getObjectId(soid, 0); try { @@ -591,11 +591,15 @@ int libradosstriper::RadosStriperImpl::remove(const std::string& soid) // delete rados objects in reverse order int rcr = 0; for (int i = nb_objects-1; i >= 0; i--) { - rcr = m_ioCtx.remove(getObjectId(soid, i)); + if (flags == 0) { + rcr = m_ioCtx.remove(getObjectId(soid, i)); + } else { + rcr = m_ioCtx.remove(getObjectId(soid, i), flags); + } if (rcr < 0 and -ENOENT != rcr) { lderr(cct()) << "RadosStriperImpl::remove : deletion incomplete for " << soid - << ", as " << getObjectId(soid, i) << " could not be deleted (rc=" << rc << ")" - << dendl; + << ", as " << getObjectId(soid, i) << " could not be deleted (rc=" << rc << ")" + << dendl; break; } } @@ -605,6 +609,7 @@ int libradosstriper::RadosStriperImpl::remove(const std::string& soid) // errror caught when trying to take the exclusive lock return e.m_code; } + } int libradosstriper::RadosStriperImpl::trunc(const std::string& soid, uint64_t size) diff --git a/src/libradosstriper/RadosStriperImpl.h b/src/libradosstriper/RadosStriperImpl.h index 7862f0596ee5..c2bb8ba321b4 100644 --- a/src/libradosstriper/RadosStriperImpl.h +++ b/src/libradosstriper/RadosStriperImpl.h @@ -187,7 +187,7 @@ struct libradosstriper::RadosStriperImpl { // stat, deletion and truncation int stat(const std::string& soid, uint64_t *psize, time_t *pmtime); - int remove(const std::string& soid); + int remove(const std::string& soid, int flags=0); int trunc(const std::string& soid, uint64_t size); // reference counting diff --git a/src/libradosstriper/libradosstriper.cc b/src/libradosstriper/libradosstriper.cc index 44079b5f4e26..969f2d814732 100644 --- a/src/libradosstriper/libradosstriper.cc +++ b/src/libradosstriper/libradosstriper.cc @@ -273,6 +273,10 @@ int libradosstriper::RadosStriper::remove(const std::string& soid) { return rados_striper_impl->remove(soid); } +int libradosstriper::RadosStriper::remove(const std::string& soid, int flags) +{ + return rados_striper_impl->remove(soid, flags); +} int libradosstriper::RadosStriper::trunc(const std::string& soid, uint64_t size) { diff --git a/src/tools/rados/rados.cc b/src/tools/rados/rados.cc index d13a3039a5c0..4057b586d360 100644 --- a/src/tools/rados/rados.cc +++ b/src/tools/rados/rados.cc @@ -2149,7 +2149,11 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts, for (; iter != nargs.end(); ++iter) { const string & oid = *iter; if (use_striper) { - ret = striper.remove(oid); + if (forcefull) { + ret = striper.remove(oid, CEPH_OSD_FLAG_FULL_FORCE); + } else { + ret = striper.remove(oid); + } } else { if (forcefull) { ret = io_ctx.remove(oid, CEPH_OSD_FLAG_FULL_FORCE);