bool async_completion,
bool log_source_bucket) {
if (!s->bucket) {
- // logging only bucket operations
- return 0;
+ ldpp_dout(dpp, 1) << "ERROR: only bucket operations are logged in bucket logging" << dendl;
+ return -EINVAL;
}
// check if bucket logging is needed
const auto& bucket_attrs = s->bucket->get_attrs();
return;
}
+ auto ret = rgw::bucketlogging::log_record(driver,
+ rgw::bucketlogging::LoggingType::Standard,
+ s->object.get(),
+ s,
+ (multipart ? "REST.PUT.PART" : canonical_name()),
+ etag,
+ s->object->get_size(),
+ this,
+ y,
+ true,
+ false);
+ if (ret < 0) {
+ ldpp_dout(this, 5) << "WARNING: in Standard mode, put object operation ignores bucket logging failure: " << ret << dendl;
+ }
+
// send request to notification manager
- int ret = res->publish_commit(this, s->obj_size, mtime, etag, s->object->get_instance());
+ ret = res->publish_commit(this, s->obj_size, mtime, etag, s->object->get_instance());
if (ret < 0) {
ldpp_dout(this, 1) << "ERROR: publishing notification failed, with error: " << ret << dendl;
// too late to rollback operation, hence op_ret is not set here
virtual const char* name() const = 0;
virtual RGWOpType get_type() { return RGW_OP_UNKNOWN; }
virtual std::string canonical_name() const { return fmt::format("REST.{}.{}", s->info.method, name()); }
+ // by default we log all bucket operations
+ virtual bool always_do_bucket_logging() const { return s->bucket != nullptr; }
virtual uint32_t op_mask() { return 0; }
RGWOpType get_type() override { return RGW_OP_PUT_OBJ; }
uint32_t op_mask() override { return RGW_OP_TYPE_WRITE; }
dmc::client_id dmclock_client() override { return dmc::client_id::data; }
+ bool always_do_bucket_logging() const override { return false; }
};
class RGWPostObj : public RGWOp {
rgw_log_op(rest, s, op, penv.olog.get());
}
- if (op) {
+ if (op && op->always_do_bucket_logging()) {
std::ignore = rgw::bucketlogging::log_record(driver,
rgw::bucketlogging::LoggingType::Standard,
s->object.get(),
int get_params(optional_yield y) override;
int get_data(bufferlist& bl) override;
- virtual std::string canonical_name() const override { return fmt::format("REST.{}.OBJECT", s->info.method); }
+ virtual std::string canonical_name() const override {
+ const bool multipart = !multipart_upload_id.empty();
+ return fmt::format("REST.{}.{}", s->info.method, multipart ? "PART" : "OBJECT");
+ }
};
class RGWPostObj_ObjStore : public RGWPostObj