From 54a6ba8c4b2be6dd7ffd4ea95ccb13ade771cced Mon Sep 17 00:00:00 2001 From: shawn Date: Fri, 11 Dec 2015 03:47:27 -0500 Subject: [PATCH] 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 --- src/include/radosstriper/libradosstriper.hpp | 2 +- src/libradosstriper/RadosStriperImpl.cc | 13 +++++++++---- src/libradosstriper/RadosStriperImpl.h | 2 +- src/libradosstriper/libradosstriper.cc | 4 ++++ src/tools/rados/rados.cc | 6 +++++- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/include/radosstriper/libradosstriper.hpp b/src/include/radosstriper/libradosstriper.hpp index 05179ffbc658c..6352d581e3b5e 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 3544cac1b787e..e9b3bd5fa59a6 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 7862f0596ee57..c2bb8ba321b4c 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 44079b5f4e267..969f2d814732f 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 d13a3039a5c08..4057b586d3603 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); -- 2.39.5