1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "cls/rgw/cls_rgw_types.h"
5 #include "common/ceph_json.h"
6 #include "include/utime.h"
9 void rgw_bucket_pending_info::generate_test_instances(list
<rgw_bucket_pending_info
*>& o
)
11 rgw_bucket_pending_info
*i
= new rgw_bucket_pending_info
;
12 i
->state
= CLS_RGW_STATE_COMPLETE
;
13 i
->op
= CLS_RGW_OP_DEL
;
15 o
.push_back(new rgw_bucket_pending_info
);
18 void rgw_bucket_pending_info::dump(Formatter
*f
) const
20 encode_json("state", (int)state
, f
);
21 utime_t
ut(timestamp
);
22 encode_json("timestamp", ut
, f
);
23 encode_json("op", (int)op
, f
);
26 void rgw_bucket_pending_info::decode_json(JSONObj
*obj
) {
28 JSONDecoder::decode_json("state", val
, obj
);
29 state
= (RGWPendingState
)val
;
30 utime_t
ut(timestamp
);
31 JSONDecoder::decode_json("timestamp", ut
, obj
);
32 JSONDecoder::decode_json("op", val
, obj
);
36 void cls_rgw_obj_key::decode_json(JSONObj
*obj
) {
37 JSONDecoder::decode_json("name", name
, obj
);
38 JSONDecoder::decode_json("instance", instance
, obj
);
41 void rgw_bucket_dir_entry_meta::generate_test_instances(list
<rgw_bucket_dir_entry_meta
*>& o
)
43 rgw_bucket_dir_entry_meta
*m
= new rgw_bucket_dir_entry_meta
;
44 m
->category
= RGWObjCategory::Main
;
48 m
->owner_display_name
= "display name";
49 m
->content_type
= "content/type";
51 o
.push_back(new rgw_bucket_dir_entry_meta
);
54 void rgw_bucket_dir_entry_meta::dump(Formatter
*f
) const
56 encode_json("category", (int)category
, f
);
57 encode_json("size", size
, f
);
59 encode_json("mtime", ut
, f
);
60 encode_json("etag", etag
, f
);
61 encode_json("storage_class", storage_class
, f
);
62 encode_json("owner", owner
, f
);
63 encode_json("owner_display_name", owner_display_name
, f
);
64 encode_json("content_type", content_type
, f
);
65 encode_json("accounted_size", accounted_size
, f
);
66 encode_json("user_data", user_data
, f
);
67 encode_json("appendable", appendable
, f
);
70 void rgw_bucket_dir_entry_meta::decode_json(JSONObj
*obj
) {
72 JSONDecoder::decode_json("category", val
, obj
);
73 category
= static_cast<RGWObjCategory
>(val
);
74 JSONDecoder::decode_json("size", size
, obj
);
76 JSONDecoder::decode_json("mtime", ut
, obj
);
77 mtime
= ut
.to_real_time();
78 JSONDecoder::decode_json("etag", etag
, obj
);
79 JSONDecoder::decode_json("storage_class", storage_class
, obj
);
80 JSONDecoder::decode_json("owner", owner
, obj
);
81 JSONDecoder::decode_json("owner_display_name", owner_display_name
, obj
);
82 JSONDecoder::decode_json("content_type", content_type
, obj
);
83 JSONDecoder::decode_json("accounted_size", accounted_size
, obj
);
84 JSONDecoder::decode_json("user_data", user_data
, obj
);
85 JSONDecoder::decode_json("appendable", appendable
, obj
);
88 void rgw_bucket_dir_entry::generate_test_instances(list
<rgw_bucket_dir_entry
*>& o
)
90 list
<rgw_bucket_dir_entry_meta
*> l
;
91 rgw_bucket_dir_entry_meta::generate_test_instances(l
);
93 list
<rgw_bucket_dir_entry_meta
*>::iterator iter
;
94 for (iter
= l
.begin(); iter
!= l
.end(); ++iter
) {
95 rgw_bucket_dir_entry_meta
*m
= *iter
;
96 rgw_bucket_dir_entry
*e
= new rgw_bucket_dir_entry
;
100 e
->locator
= "locator";
109 o
.push_back(new rgw_bucket_dir_entry
);
112 void rgw_bucket_entry_ver::dump(Formatter
*f
) const
114 encode_json("pool", pool
, f
);
115 encode_json("epoch", epoch
, f
);
118 void rgw_bucket_entry_ver::decode_json(JSONObj
*obj
) {
119 JSONDecoder::decode_json("pool", pool
, obj
);
120 JSONDecoder::decode_json("epoch", epoch
, obj
);
123 void rgw_bucket_entry_ver::generate_test_instances(list
<rgw_bucket_entry_ver
*>& ls
)
125 ls
.push_back(new rgw_bucket_entry_ver
);
126 ls
.push_back(new rgw_bucket_entry_ver
);
127 ls
.back()->pool
= 123;
128 ls
.back()->epoch
= 12322;
132 void rgw_bucket_dir_entry::dump(Formatter
*f
) const
134 encode_json("name", key
.name
, f
);
135 encode_json("instance", key
.instance
, f
);
136 encode_json("ver", ver
, f
);
137 encode_json("locator", locator
, f
);
138 encode_json("exists", exists
, f
);
139 encode_json("meta", meta
, f
);
140 encode_json("tag", tag
, f
);
141 encode_json("flags", (int)flags
, f
);
142 encode_json("pending_map", pending_map
, f
);
143 encode_json("versioned_epoch", versioned_epoch
, f
);
146 void rgw_bucket_dir_entry::decode_json(JSONObj
*obj
) {
147 JSONDecoder::decode_json("name", key
.name
, obj
);
148 JSONDecoder::decode_json("instance", key
.instance
, obj
);
149 JSONDecoder::decode_json("ver", ver
, obj
);
150 JSONDecoder::decode_json("locator", locator
, obj
);
151 JSONDecoder::decode_json("exists", exists
, obj
);
152 JSONDecoder::decode_json("meta", meta
, obj
);
153 JSONDecoder::decode_json("tag", tag
, obj
);
155 JSONDecoder::decode_json("flags", val
, obj
);
156 flags
= (uint16_t)val
;
157 JSONDecoder::decode_json("pending_map", pending_map
, obj
);
158 JSONDecoder::decode_json("versioned_epoch", versioned_epoch
, obj
);
161 static void dump_bi_entry(bufferlist bl
, BIIndexType index_type
, Formatter
*formatter
)
163 auto iter
= bl
.cbegin();
164 switch (index_type
) {
165 case BIIndexType::Plain
:
166 case BIIndexType::Instance
:
168 rgw_bucket_dir_entry entry
;
170 encode_json("entry", entry
, formatter
);
173 case BIIndexType::OLH
:
175 rgw_bucket_olh_entry entry
;
177 encode_json("entry", entry
, formatter
);
185 void rgw_cls_bi_entry::decode_json(JSONObj
*obj
, cls_rgw_obj_key
*effective_key
) {
186 JSONDecoder::decode_json("idx", idx
, obj
);
188 JSONDecoder::decode_json("type", s
, obj
);
190 type
= BIIndexType::Plain
;
191 } else if (s
== "instance") {
192 type
= BIIndexType::Instance
;
193 } else if (s
== "olh") {
194 type
= BIIndexType::OLH
;
196 type
= BIIndexType::Invalid
;
200 case BIIndexType::Plain
:
201 case BIIndexType::Instance
:
203 rgw_bucket_dir_entry entry
;
204 JSONDecoder::decode_json("entry", entry
, obj
);
208 *effective_key
= entry
.key
;
212 case BIIndexType::OLH
:
214 rgw_bucket_olh_entry entry
;
215 JSONDecoder::decode_json("entry", entry
, obj
);
219 *effective_key
= entry
.key
;
228 void rgw_cls_bi_entry::dump(Formatter
*f
) const
232 case BIIndexType::Plain
:
235 case BIIndexType::Instance
:
236 type_str
= "instance";
238 case BIIndexType::OLH
:
242 type_str
= "invalid";
244 encode_json("type", type_str
, f
);
245 encode_json("idx", idx
, f
);
246 dump_bi_entry(data
, type
, f
);
249 bool rgw_cls_bi_entry::get_info(cls_rgw_obj_key
*key
,
250 RGWObjCategory
*category
,
251 rgw_bucket_category_stats
*accounted_stats
)
253 bool account
= false;
254 auto iter
= data
.cbegin();
257 case BIIndexType::Plain
:
259 // NO BREAK; falls through to case InstanceIdx:
260 case BIIndexType::Instance
:
262 rgw_bucket_dir_entry entry
;
265 *category
= entry
.meta
.category
;
266 accounted_stats
->num_entries
++;
267 accounted_stats
->total_size
+= entry
.meta
.accounted_size
;
268 accounted_stats
->total_size_rounded
+= cls_rgw_get_rounded_size(entry
.meta
.accounted_size
);
269 accounted_stats
->actual_size
+= entry
.meta
.size
;
272 case BIIndexType::OLH
:
274 rgw_bucket_olh_entry entry
;
286 void rgw_bucket_olh_entry::dump(Formatter
*f
) const
288 encode_json("key", key
, f
);
289 encode_json("delete_marker", delete_marker
, f
);
290 encode_json("epoch", epoch
, f
);
291 encode_json("pending_log", pending_log
, f
);
292 encode_json("tag", tag
, f
);
293 encode_json("exists", exists
, f
);
294 encode_json("pending_removal", pending_removal
, f
);
297 void rgw_bucket_olh_entry::decode_json(JSONObj
*obj
)
299 JSONDecoder::decode_json("key", key
, obj
);
300 JSONDecoder::decode_json("delete_marker", delete_marker
, obj
);
301 JSONDecoder::decode_json("epoch", epoch
, obj
);
302 JSONDecoder::decode_json("pending_log", pending_log
, obj
);
303 JSONDecoder::decode_json("tag", tag
, obj
);
304 JSONDecoder::decode_json("exists", exists
, obj
);
305 JSONDecoder::decode_json("pending_removal", pending_removal
, obj
);
308 void rgw_bucket_olh_log_entry::generate_test_instances(list
<rgw_bucket_olh_log_entry
*>& o
)
310 rgw_bucket_olh_log_entry
*entry
= new rgw_bucket_olh_log_entry
;
312 entry
->op
= CLS_RGW_OLH_OP_LINK_OLH
;
313 entry
->op_tag
= "op_tag";
314 entry
->key
.name
= "key.name";
315 entry
->key
.instance
= "key.instance";
316 entry
->delete_marker
= true;
318 o
.push_back(new rgw_bucket_olh_log_entry
);
321 void rgw_bucket_olh_log_entry::dump(Formatter
*f
) const
323 encode_json("epoch", epoch
, f
);
326 case CLS_RGW_OLH_OP_LINK_OLH
:
329 case CLS_RGW_OLH_OP_UNLINK_OLH
:
330 op_str
= "unlink_olh";
332 case CLS_RGW_OLH_OP_REMOVE_INSTANCE
:
333 op_str
= "remove_instance";
338 encode_json("op", op_str
, f
);
339 encode_json("op_tag", op_tag
, f
);
340 encode_json("key", key
, f
);
341 encode_json("delete_marker", delete_marker
, f
);
344 void rgw_bucket_olh_log_entry::decode_json(JSONObj
*obj
)
346 JSONDecoder::decode_json("epoch", epoch
, obj
);
348 JSONDecoder::decode_json("op", op_str
, obj
);
349 if (op_str
== "link_olh") {
350 op
= CLS_RGW_OLH_OP_LINK_OLH
;
351 } else if (op_str
== "unlink_olh") {
352 op
= CLS_RGW_OLH_OP_UNLINK_OLH
;
353 } else if (op_str
== "remove_instance") {
354 op
= CLS_RGW_OLH_OP_REMOVE_INSTANCE
;
356 op
= CLS_RGW_OLH_OP_UNKNOWN
;
358 JSONDecoder::decode_json("op_tag", op_tag
, obj
);
359 JSONDecoder::decode_json("key", key
, obj
);
360 JSONDecoder::decode_json("delete_marker", delete_marker
, obj
);
362 void rgw_bi_log_entry::decode_json(JSONObj
*obj
)
364 JSONDecoder::decode_json("op_id", id
, obj
);
365 JSONDecoder::decode_json("op_tag", tag
, obj
);
367 JSONDecoder::decode_json("op", op_str
, obj
);
368 if (op_str
== "write") {
370 } else if (op_str
== "del") {
372 } else if (op_str
== "cancel") {
373 op
= CLS_RGW_OP_CANCEL
;
374 } else if (op_str
== "unknown") {
375 op
= CLS_RGW_OP_UNKNOWN
;
376 } else if (op_str
== "link_olh") {
377 op
= CLS_RGW_OP_LINK_OLH
;
378 } else if (op_str
== "link_olh_del") {
379 op
= CLS_RGW_OP_LINK_OLH_DM
;
380 } else if (op_str
== "unlink_instance") {
381 op
= CLS_RGW_OP_UNLINK_INSTANCE
;
382 } else if (op_str
== "syncstop") {
383 op
= CLS_RGW_OP_SYNCSTOP
;
384 } else if (op_str
== "resync") {
385 op
= CLS_RGW_OP_RESYNC
;
387 op
= CLS_RGW_OP_UNKNOWN
;
389 JSONDecoder::decode_json("object", object
, obj
);
390 JSONDecoder::decode_json("instance", instance
, obj
);
392 JSONDecoder::decode_json("state", state_str
, obj
);
393 if (state_str
== "pending") {
394 state
= CLS_RGW_STATE_PENDING_MODIFY
;
395 } else if (state_str
== "complete") {
396 state
= CLS_RGW_STATE_COMPLETE
;
398 state
= CLS_RGW_STATE_UNKNOWN
;
400 JSONDecoder::decode_json("index_ver", index_ver
, obj
);
402 JSONDecoder::decode_json("timestamp", ut
, obj
);
403 timestamp
= ut
.to_real_time();
405 JSONDecoder::decode_json("bilog_flags", f
, obj
);
406 JSONDecoder::decode_json("ver", ver
, obj
);
407 bilog_flags
= (uint16_t)f
;
408 JSONDecoder::decode_json("owner", owner
, obj
);
409 JSONDecoder::decode_json("owner_display_name", owner_display_name
, obj
);
410 JSONDecoder::decode_json("zones_trace", zones_trace
, obj
);
413 void rgw_bi_log_entry::dump(Formatter
*f
) const
415 f
->dump_string("op_id", id
);
416 f
->dump_string("op_tag", tag
);
419 f
->dump_string("op", "write");
422 f
->dump_string("op", "del");
424 case CLS_RGW_OP_CANCEL
:
425 f
->dump_string("op", "cancel");
427 case CLS_RGW_OP_UNKNOWN
:
428 f
->dump_string("op", "unknown");
430 case CLS_RGW_OP_LINK_OLH
:
431 f
->dump_string("op", "link_olh");
433 case CLS_RGW_OP_LINK_OLH_DM
:
434 f
->dump_string("op", "link_olh_del");
436 case CLS_RGW_OP_UNLINK_INSTANCE
:
437 f
->dump_string("op", "unlink_instance");
439 case CLS_RGW_OP_SYNCSTOP
:
440 f
->dump_string("op", "syncstop");
442 case CLS_RGW_OP_RESYNC
:
443 f
->dump_string("op", "resync");
446 f
->dump_string("op", "invalid");
450 f
->dump_string("object", object
);
451 f
->dump_string("instance", instance
);
454 case CLS_RGW_STATE_PENDING_MODIFY
:
455 f
->dump_string("state", "pending");
457 case CLS_RGW_STATE_COMPLETE
:
458 f
->dump_string("state", "complete");
461 f
->dump_string("state", "invalid");
465 f
->dump_int("index_ver", index_ver
);
466 utime_t
ut(timestamp
);
467 ut
.gmtime_nsec(f
->dump_stream("timestamp"));
468 f
->open_object_section("ver");
471 f
->dump_int("bilog_flags", bilog_flags
);
472 f
->dump_bool("versioned", (bilog_flags
& RGW_BILOG_FLAG_VERSIONED_OP
) != 0);
473 f
->dump_string("owner", owner
);
474 f
->dump_string("owner_display_name", owner_display_name
);
475 encode_json("zones_trace", zones_trace
, f
);
478 void rgw_bi_log_entry::generate_test_instances(list
<rgw_bi_log_entry
*>& ls
)
480 ls
.push_back(new rgw_bi_log_entry
);
481 ls
.push_back(new rgw_bi_log_entry
);
482 ls
.back()->id
= "midf";
483 ls
.back()->object
= "obj";
484 ls
.back()->timestamp
= ceph::real_clock::from_ceph_timespec({init_le32(2), init_le32(3)});
485 ls
.back()->index_ver
= 4323;
486 ls
.back()->tag
= "tagasdfds";
487 ls
.back()->op
= CLS_RGW_OP_DEL
;
488 ls
.back()->state
= CLS_RGW_STATE_PENDING_MODIFY
;
491 void rgw_bucket_category_stats::generate_test_instances(list
<rgw_bucket_category_stats
*>& o
)
493 rgw_bucket_category_stats
*s
= new rgw_bucket_category_stats
;
494 s
->total_size
= 1024;
495 s
->total_size_rounded
= 4096;
497 s
->actual_size
= 1024;
499 o
.push_back(new rgw_bucket_category_stats
);
502 void rgw_bucket_category_stats::dump(Formatter
*f
) const
504 f
->dump_unsigned("total_size", total_size
);
505 f
->dump_unsigned("total_size_rounded", total_size_rounded
);
506 f
->dump_unsigned("num_entries", num_entries
);
507 f
->dump_unsigned("actual_size", actual_size
);
510 void rgw_bucket_dir_header::generate_test_instances(list
<rgw_bucket_dir_header
*>& o
)
512 list
<rgw_bucket_category_stats
*> l
;
513 list
<rgw_bucket_category_stats
*>::iterator iter
;
514 rgw_bucket_category_stats::generate_test_instances(l
);
517 for (i
= 0, iter
= l
.begin(); iter
!= l
.end(); ++iter
, ++i
) {
518 RGWObjCategory c
= static_cast<RGWObjCategory
>(i
);
519 rgw_bucket_dir_header
*h
= new rgw_bucket_dir_header
;
520 rgw_bucket_category_stats
*s
= *iter
;
528 o
.push_back(new rgw_bucket_dir_header
);
531 void rgw_bucket_dir_header::dump(Formatter
*f
) const
533 f
->dump_int("ver", ver
);
534 f
->dump_int("master_ver", master_ver
);
535 f
->open_array_section("stats");
536 for (auto iter
= stats
.begin(); iter
!= stats
.end(); ++iter
) {
537 f
->dump_int("category", int(iter
->first
));
538 f
->open_object_section("category_stats");
539 iter
->second
.dump(f
);
543 ::encode_json("new_instance", new_instance
, f
);
546 void rgw_bucket_dir::generate_test_instances(list
<rgw_bucket_dir
*>& o
)
548 list
<rgw_bucket_dir_header
*> l
;
549 list
<rgw_bucket_dir_header
*>::iterator iter
;
550 rgw_bucket_dir_header::generate_test_instances(l
);
553 for (i
= 0, iter
= l
.begin(); iter
!= l
.end(); ++iter
, ++i
) {
554 rgw_bucket_dir
*d
= new rgw_bucket_dir
;
555 rgw_bucket_dir_header
*h
= *iter
;
558 list
<rgw_bucket_dir_entry
*> el
;
559 list
<rgw_bucket_dir_entry
*>::iterator eiter
;
560 for (eiter
= el
.begin(); eiter
!= el
.end(); ++eiter
) {
561 rgw_bucket_dir_entry
*e
= *eiter
;
562 d
->m
[e
->key
.name
] = *e
;
572 o
.push_back(new rgw_bucket_dir
);
575 void rgw_bucket_dir::dump(Formatter
*f
) const
577 f
->open_object_section("header");
580 map
<string
, rgw_bucket_dir_entry
>::const_iterator iter
= m
.begin();
581 f
->open_array_section("map");
582 for (; iter
!= m
.end(); ++iter
) {
583 f
->dump_string("key", iter
->first
);
584 f
->open_object_section("dir_entry");
585 iter
->second
.dump(f
);
591 void rgw_usage_log_entry::dump(Formatter
*f
) const
593 f
->dump_string("owner", owner
.to_str());
594 f
->dump_string("payer", payer
.to_str());
595 f
->dump_string("bucket", bucket
);
596 f
->dump_unsigned("epoch", epoch
);
598 f
->open_object_section("total_usage");
599 f
->dump_unsigned("bytes_sent", total_usage
.bytes_sent
);
600 f
->dump_unsigned("bytes_received", total_usage
.bytes_received
);
601 f
->dump_unsigned("ops", total_usage
.ops
);
602 f
->dump_unsigned("successful_ops", total_usage
.successful_ops
);
605 f
->open_array_section("categories");
606 if (usage_map
.size() > 0) {
607 map
<string
, rgw_usage_data
>::const_iterator it
;
608 for (it
= usage_map
.begin(); it
!= usage_map
.end(); it
++) {
609 const rgw_usage_data
& total_usage
= it
->second
;
610 f
->open_object_section("entry");
611 f
->dump_string("category", it
->first
.c_str());
612 f
->dump_unsigned("bytes_sent", total_usage
.bytes_sent
);
613 f
->dump_unsigned("bytes_received", total_usage
.bytes_received
);
614 f
->dump_unsigned("ops", total_usage
.ops
);
615 f
->dump_unsigned("successful_ops", total_usage
.successful_ops
);
622 void rgw_usage_log_entry::generate_test_instances(list
<rgw_usage_log_entry
*> &o
)
624 rgw_usage_log_entry
*entry
= new rgw_usage_log_entry
;
625 rgw_usage_data usage_data
{1024, 2048};
626 entry
->owner
= rgw_user("owner");
627 entry
->payer
= rgw_user("payer");
628 entry
->bucket
= "bucket";
630 entry
->total_usage
.bytes_sent
= usage_data
.bytes_sent
;
631 entry
->total_usage
.bytes_received
= usage_data
.bytes_received
;
632 entry
->total_usage
.ops
= usage_data
.ops
;
633 entry
->total_usage
.successful_ops
= usage_data
.successful_ops
;
634 entry
->usage_map
["get_obj"] = usage_data
;
636 o
.push_back(new rgw_usage_log_entry
);
639 void cls_rgw_reshard_entry::generate_key(const string
& tenant
, const string
& bucket_name
, string
*key
)
641 *key
= tenant
+ ":" + bucket_name
;
644 void cls_rgw_reshard_entry::get_key(string
*key
) const
646 generate_key(tenant
, bucket_name
, key
);
649 void cls_rgw_reshard_entry::dump(Formatter
*f
) const
652 encode_json("time",ut
, f
);
653 encode_json("tenant", tenant
, f
);
654 encode_json("bucket_name", bucket_name
, f
);
655 encode_json("bucket_id", bucket_id
, f
);
656 encode_json("new_instance_id", new_instance_id
, f
);
657 encode_json("old_num_shards", old_num_shards
, f
);
658 encode_json("new_num_shards", new_num_shards
, f
);
662 void cls_rgw_reshard_entry::generate_test_instances(list
<cls_rgw_reshard_entry
*>& ls
)
664 ls
.push_back(new cls_rgw_reshard_entry
);
665 ls
.push_back(new cls_rgw_reshard_entry
);
666 ls
.back()->time
= ceph::real_clock::from_ceph_timespec({init_le32(2), init_le32(3)});
667 ls
.back()->tenant
= "tenant";
668 ls
.back()->bucket_name
= "bucket1""";
669 ls
.back()->bucket_id
= "bucket_id";
670 ls
.back()->new_instance_id
= "new_instance_id";
671 ls
.back()->old_num_shards
= 8;
672 ls
.back()->new_num_shards
= 64;
675 void cls_rgw_bucket_instance_entry::dump(Formatter
*f
) const
677 encode_json("reshard_status", to_string(reshard_status
), f
);
678 encode_json("new_bucket_instance_id", new_bucket_instance_id
, f
);
679 encode_json("num_shards", num_shards
, f
);
683 void cls_rgw_bucket_instance_entry::generate_test_instances(list
<cls_rgw_bucket_instance_entry
*>& ls
)
685 ls
.push_back(new cls_rgw_bucket_instance_entry
);
686 ls
.push_back(new cls_rgw_bucket_instance_entry
);
687 ls
.back()->reshard_status
= CLS_RGW_RESHARD_IN_PROGRESS
;
688 ls
.back()->new_bucket_instance_id
= "new_instance_id";
691 void cls_rgw_lc_obj_head::dump(Formatter
*f
) const
693 encode_json("start_date", start_date
, f
);
694 encode_json("marker", marker
, f
);
697 void cls_rgw_lc_obj_head::generate_test_instances(list
<cls_rgw_lc_obj_head
*>& ls
)