@@ -1071,6 +1071,56 @@ int RadosBucket::remove_topics(RGWObjVersionTracker* objv_tracker,
10711071 objv_tracker, y);
10721072}
10731073
1074+
1075+ #define RGW_ATTR_COMMITTED_LOGGING_OBJ RGW_ATTR_PREFIX " committed-logging-obj"
1076+
1077+ int get_committed_logging_object (RadosStore* store,
1078+ const std::string& obj_name_oid,
1079+ const rgw_pool& data_pool,
1080+ optional_yield y,
1081+ const DoutPrefixProvider *dpp,
1082+ std::string& last_committed) {
1083+ librados::IoCtx io_ctx;
1084+ if (const int ret = rgw_init_ioctx (dpp, store->getRados ()->get_rados_handle (), data_pool, io_ctx); ret < 0 ) {
1085+ return -EIO;
1086+ }
1087+ if (!io_ctx.is_valid ()) {
1088+ return -EIO;
1089+ }
1090+ bufferlist bl;
1091+ librados::ObjectReadOperation op;
1092+ int rval;
1093+ op.getxattr (RGW_ATTR_COMMITTED_LOGGING_OBJ, &bl, &rval);
1094+ if (const int ret = rgw_rados_operate (dpp, io_ctx, obj_name_oid, std::move (op), nullptr , y); ret < 0 ) {
1095+ return ret;
1096+ }
1097+ last_committed = bl.to_str ();
1098+ return 0 ;
1099+ }
1100+
1101+ int set_committed_logging_object (RadosStore* store,
1102+ const std::string& obj_name_oid,
1103+ const rgw_pool& data_pool,
1104+ optional_yield y,
1105+ const DoutPrefixProvider *dpp,
1106+ const std::string& last_committed) {
1107+ librados::IoCtx io_ctx;
1108+ if (const int ret = rgw_init_ioctx (dpp, store->getRados ()->get_rados_handle (), data_pool, io_ctx); ret < 0 ) {
1109+ ldpp_dout (dpp, 1 ) << " ERROR: failed to get IO context when setting last committed logging object name from data pool:" << data_pool.to_str () << dendl;
1110+ return -EIO;
1111+ }
1112+ if (!io_ctx.is_valid ()) {
1113+ ldpp_dout (dpp, 1 ) << " ERROR: invalid IO context when setting last committed logging object name" << dendl;
1114+ return -EIO;
1115+ }
1116+
1117+ bufferlist bl;
1118+ bl.append (last_committed);
1119+ librados::ObjectWriteOperation op;
1120+ op.setxattr (RGW_ATTR_COMMITTED_LOGGING_OBJ, std::move (bl));
1121+ return rgw_rados_operate (dpp, io_ctx, obj_name_oid, std::move (op), y);
1122+ }
1123+
10741124int RadosBucket::get_logging_object_name (std::string& obj_name,
10751125 const std::string& prefix,
10761126 optional_yield y,
@@ -1129,7 +1179,7 @@ int RadosBucket::set_logging_object_name(const std::string& obj_name,
11291179 objv_tracker,
11301180 ceph::real_time::clock::now (),
11311181 y,
1132- nullptr );
1182+ no_change_attrs () );
11331183 if (ret == -EEXIST) {
11341184 ldpp_dout (dpp, 20 ) << " INFO: race detected in initializing '" << obj_name_oid << " ' with logging object name:'" << obj_name << " '. ret = " << ret << dendl;
11351185 } else if (ret == -ECANCELED) {
@@ -1183,7 +1233,11 @@ int RadosBucket::remove_logging_object(const std::string& obj_name, optional_yie
11831233 y);
11841234}
11851235
1186- int RadosBucket::commit_logging_object (const std::string& obj_name, optional_yield y, const DoutPrefixProvider *dpp) {
1236+ int RadosBucket::commit_logging_object (const std::string& obj_name,
1237+ optional_yield y,
1238+ const DoutPrefixProvider *dpp,
1239+ const std::string& prefix,
1240+ std::string* last_committed) {
11871241 rgw_pool data_pool;
11881242 const rgw_obj head_obj{get_key (), obj_name};
11891243 const auto placement_rule = get_placement_rule ();
@@ -1193,6 +1247,24 @@ int RadosBucket::commit_logging_object(const std::string& obj_name, optional_yie
11931247 " ' when committing logging object" << dendl;
11941248 return -EIO;
11951249 }
1250+ const auto obj_name_oid = bucketlogging::object_name_oid (this , prefix);
1251+ if (last_committed) {
1252+ if (const int ret = get_committed_logging_object (store,
1253+ obj_name_oid,
1254+ data_pool,
1255+ y,
1256+ dpp,
1257+ *last_committed); ret < 0 ) {
1258+ if (ret != -ENODATA) {
1259+ ldpp_dout (dpp, 1 ) << " ERROR: failed to get last committed logging object name from bucket '" << get_key () <<
1260+ " ' when committing logging object. ret = " << ret << dendl;
1261+ return ret;
1262+ }
1263+ ldpp_dout (dpp, 5 ) << " WARNING: no last committed logging object name found for bucket '" << get_key () <<
1264+ " ' when committing logging object" << dendl;
1265+ last_committed->clear ();
1266+ }
1267+ }
11961268
11971269 const auto temp_obj_name = to_temp_object_name (this , obj_name);
11981270 std::map<string, bufferlist> obj_attrs;
@@ -1207,13 +1279,14 @@ int RadosBucket::commit_logging_object(const std::string& obj_name, optional_yie
12071279 y,
12081280 dpp,
12091281 &obj_attrs,
1210- nullptr ); ret < 0 && ret != -ENOENT) {
1211- ldpp_dout (dpp, 1 ) << " ERROR: failed to read logging data when committing object '" << temp_obj_name
1212- << " . error: " << ret << dendl;
1282+ nullptr ); ret < 0 ) {
1283+ if (ret == -ENOENT) {
1284+ ldpp_dout (dpp, 5 ) << " WARNING: temporary logging object '" << temp_obj_name << " ' does not exists" << dendl;
1285+ } else {
1286+ ldpp_dout (dpp, 1 ) << " ERROR: failed to read logging data when committing object '" << temp_obj_name
1287+ << " . error: " << ret << dendl;
1288+ }
12131289 return ret;
1214- } else if (ret == -ENOENT) {
1215- ldpp_dout (dpp, 1 ) << " WARNING: temporary logging object '" << temp_obj_name << " ' does not exists" << dendl;
1216- return 0 ;
12171290 }
12181291
12191292 uint64_t size = bl_data.length ();
@@ -1279,9 +1352,24 @@ int RadosBucket::commit_logging_object(const std::string& obj_name, optional_yie
12791352 " ' to bucket '" << get_key () <<" '. error: " << ret << dendl;
12801353 return ret;
12811354 }
1355+
12821356 ldpp_dout (dpp, 20 ) << " INFO: committed logging object '" << temp_obj_name <<
12831357 " ' with size of " << size << " bytes, to bucket '" << get_key () << " ' as '" <<
12841358 obj_name << " '" << dendl;
1359+
1360+ if (const int ret = set_committed_logging_object (store,
1361+ obj_name_oid,
1362+ data_pool,
1363+ y,
1364+ dpp,
1365+ obj_name); ret < 0 ) {
1366+ ldpp_dout (dpp, 5 ) << " WARNING: object was committed, but we failed to set last committed logging object name. ret = " << ret << dendl;
1367+ } else {
1368+ ldpp_dout (dpp, 20 ) << " INFO: last committed logging object name was set to '" << obj_name << " '" << dendl;
1369+ }
1370+ if (last_committed) {
1371+ *last_committed = obj_name;
1372+ }
12851373 return 0 ;
12861374}
12871375
0 commit comments