From: Yehuda Sadeh Date: Tue, 5 Feb 2013 21:54:11 +0000 (-0800) Subject: rgw: radosgw-admin object unlink X-Git-Tag: v0.57~39 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=50c1775dda694efa39f2ee43cd347cf0b99b8628;p=ceph.git rgw: radosgw-admin object unlink Add a radosgw-admin option to remove object from bucket index Signed-off-by: Yehuda Sadeh (cherry picked from commit 16235a7acb9543d60470170bb2a09956364626cd) Conflicts: src/rgw/rgw_admin.cc src/rgw/rgw_rados.h src/test/cli/radosgw-admin/help.t --- diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 860a4d19eba6..a3b1271d9ce9 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -55,6 +55,7 @@ void _usage() cerr << " bucket rm remove bucket\n"; cerr << " bucket check check bucket index\n"; cerr << " object rm remove object\n"; + cerr << " object unlink unlink object from bucket index\n"; cerr << " cluster info show cluster params info\n"; cerr << " pool add add an existing pool for data placement\n"; cerr << " pool rm remove an existing pool from data placement set\n"; @@ -155,6 +156,7 @@ enum { OPT_USAGE_TRIM, OPT_TEMP_REMOVE, OPT_OBJECT_RM, + OPT_OBJECT_UNLINK, OPT_GC_LIST, OPT_GC_PROCESS, OPT_CLUSTER_INFO, @@ -227,6 +229,7 @@ static int get_cmd(const char *cmd, const char *prev_cmd, bool *need_more) strcmp(cmd, "key") == 0 || strcmp(cmd, "buckets") == 0 || strcmp(cmd, "bucket") == 0 || + strcmp(cmd, "object") == 0 || strcmp(cmd, "pool") == 0 || strcmp(cmd, "pools") == 0 || strcmp(cmd, "log") == 0 || @@ -318,6 +321,8 @@ static int get_cmd(const char *cmd, const char *prev_cmd, bool *need_more) } else if (strcmp(prev_cmd, "object") == 0) { if (strcmp(cmd, "rm") == 0) return OPT_OBJECT_RM; + if (strcmp(cmd, "unlink") == 0) + return OPT_OBJECT_UNLINK; } else if (strcmp(prev_cmd, "cluster") == 0) { if (strcmp(cmd, "info") == 0) return OPT_CLUSTER_INFO; @@ -1627,6 +1632,14 @@ next: } } + if (opt_cmd == OPT_OBJECT_UNLINK) { + int ret = store->remove_obj_from_index(bucket, object); + if (ret < 0) { + cerr << "ERROR: remove_obj_from_index() returned error: " << cpp_strerror(-ret) << std::endl; + return 1; + } + } + if (opt_cmd == OPT_BUCKET_CHECK) { map existing_stats; map calculated_stats; @@ -1757,5 +1770,6 @@ next: store->params.dump(formatter); formatter->flush(cout); } + return 0; } diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index d75b0d8a8e55..895dd7001e14 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -3228,6 +3228,32 @@ int RGWRados::cls_obj_usage_log_trim(string& oid, string& user, uint64_t start_e return r; } +int RGWRados::remove_obj_from_index(rgw_bucket& bucket, const string& oid) +{ + librados::IoCtx io_ctx; + + int r = open_bucket_ctx(bucket, io_ctx); + if (r < 0) + return r; + + string dir_oid = dir_oid_prefix; + dir_oid.append(bucket.marker); + + rgw_bucket_dir_entry entry; + entry.epoch = (uint64_t)-1; // ULLONG_MAX, needed to that objclass doesn't skip out request + entry.name = oid; + + bufferlist updates; + updates.append(CEPH_RGW_REMOVE); + ::encode(entry, updates); + + bufferlist out; + + r = io_ctx.exec(dir_oid, "rgw", "dir_suggest_changes", updates, out); + + return r; +} + int RGWRados::check_disk_state(librados::IoCtx io_ctx, rgw_bucket& bucket, rgw_bucket_dir_entry& list_state, diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index e2ab4e244994..e50ef5d4490a 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -720,6 +720,8 @@ public: map *existing_stats, map *calculated_stats); int bucket_rebuild_index(rgw_bucket& bucket); + int remove_obj_from_index(rgw_bucket& bucket, const string& oid); + private: int process_intent_log(rgw_bucket& bucket, string& oid, time_t epoch, int flags, bool purge); diff --git a/src/test/cli/radosgw-admin/help.t b/src/test/cli/radosgw-admin/help.t index 0ab4eace52bc..1927023a2a7b 100644 --- a/src/test/cli/radosgw-admin/help.t +++ b/src/test/cli/radosgw-admin/help.t @@ -21,6 +21,7 @@ bucket rm remove bucket bucket check check bucket index object rm remove object + object unlink unlink object from bucket index cluster info show cluster params info pool add add an existing pool for data placement pool rm remove an existing pool from data placement set