svc()->topic->svc.meta_be->alloc_ctx());
ctx->init(svc()->topic->get_be_handler());
const int ret = svc()->topic->svc.meta_be->get(
- ctx.get(), get_topic_key(topic_name, tenant), params, objv_tracker, y,
- dpp);
+ ctx.get(), get_topic_metadata_key(tenant, topic_name),
+ params, objv_tracker, y, dpp);
if (ret < 0) {
return ret;
}
svc()->topic->svc.meta_be->alloc_ctx());
ctx->init(svc()->topic->get_be_handler());
return svc()->topic->svc.meta_be->put(
- ctx.get(), get_topic_key(topic.name, topic.user.tenant), params,
- objv_tracker, y, dpp);
+ ctx.get(), get_topic_metadata_key(topic.user.tenant, topic.name),
+ params, objv_tracker, y, dpp);
}
int RadosStore::remove_topic_v2(const std::string& topic_name,
svc()->topic->svc.meta_be->alloc_ctx());
ctx->init(svc()->topic->get_be_handler());
return svc()->topic->svc.meta_be->remove(ctx.get(),
- get_topic_key(topic_name, tenant),
+ get_topic_metadata_key(tenant, topic_name),
params, objv_tracker, y, dpp);
}
#include "rgw_b64.h"
#include "rgw_sal.h"
#include "rgw_pubsub.h"
+#include "rgw_string.h"
#include "rgw_tools.h"
#include "rgw_xml.h"
#include "rgw_arn.h"
#define dout_subsys ceph_subsys_rgw
+static constexpr std::string_view topic_tenant_delim = ":";
+
+// format and parse topic metadata keys as tenant:name
+std::string get_topic_metadata_key(std::string_view tenant,
+ std::string_view topic_name)
+{
+ return string_cat_reserve(tenant, topic_tenant_delim, topic_name);
+}
+
+void parse_topic_metadata_key(const std::string& key,
+ std::string& tenant,
+ std::string& name)
+{
+ // expected format: tenant_name:topic_name*
+ auto pos = key.find(topic_tenant_delim);
+ if (pos != std::string::npos) {
+ tenant = key.substr(0, pos);
+ name = key.substr(pos + 1);
+ } else {
+ tenant.clear();
+ name = key;
+ }
+}
+
void set_event_id(std::string& id, const std::string& hash, const utime_t& ts) {
char buf[64];
const auto len = snprintf(buf, sizeof(buf), "%010ld.%06ld.%s", (long)ts.sec(), (long)ts.usec(), hash.c_str());
<< "ERROR: lists_keys_next(): " << cpp_strerror(-ret) << dendl;
return ret;
}
- for (auto& topic_entry : topics) {
+ for (const auto& key : topics) {
std::string topic_name;
std::string topic_tenant;
- parse_topic_entry(topic_entry, &topic_tenant, &topic_name);
+ parse_topic_metadata_key(key, topic_tenant, topic_name);
if (tenant != topic_tenant) {
continue;
}
int get_bucket_notifications(const DoutPrefixProvider* dpp,
rgw::sal::Bucket* bucket,
rgw_pubsub_bucket_topics& bucket_topics);
+
+// format and parse topic metadata keys as tenant:name
+std::string get_topic_metadata_key(std::string_view topic_name,
+ std::string_view tenant);
+void parse_topic_metadata_key(const std::string& key,
+ std::string& tenant_name,
+ std::string& topic_name);
RGWSI_Topic_RADOS* topic_svc;
};
-std::string get_topic_key(const std::string& topic_name,
- const std::string& tenant);
-
-void parse_topic_entry(const std::string& topic_entry,
- std::string* tenant_name,
- std::string* topic_name);
-
-std::string get_bucket_topic_mapping_oid(const rgw_pubsub_topic& topic);
\ No newline at end of file
+std::string get_bucket_topic_mapping_oid(const rgw_pubsub_topic& topic);