]> git.proxmox.com Git - ceph.git/blame - ceph/src/cls/rgw/cls_rgw_types.cc
update sources to 12.2.8
[ceph.git] / ceph / src / cls / rgw / cls_rgw_types.cc
CommitLineData
7c673cae
FG
1
2#include "cls/rgw/cls_rgw_types.h"
7c673cae
FG
3#include "common/ceph_json.h"
4#include "include/utime.h"
5
6
7void rgw_bucket_pending_info::generate_test_instances(list<rgw_bucket_pending_info*>& o)
8{
9 rgw_bucket_pending_info *i = new rgw_bucket_pending_info;
10 i->state = CLS_RGW_STATE_COMPLETE;
11 i->op = CLS_RGW_OP_DEL;
12 o.push_back(i);
13 o.push_back(new rgw_bucket_pending_info);
14}
15
16void rgw_bucket_pending_info::dump(Formatter *f) const
17{
18 encode_json("state", (int)state, f);
19 utime_t ut(timestamp);
20 encode_json("timestamp", ut, f);
21 encode_json("op", (int)op, f);
22}
23
24void rgw_bucket_pending_info::decode_json(JSONObj *obj) {
25 int val;
26 JSONDecoder::decode_json("state", val, obj);
27 state = (RGWPendingState)val;
28 utime_t ut(timestamp);
29 JSONDecoder::decode_json("timestamp", ut, obj);
30 JSONDecoder::decode_json("op", val, obj);
31 op = (uint8_t)val;
32}
33
34void cls_rgw_obj_key::decode_json(JSONObj *obj) {
35 JSONDecoder::decode_json("name", name, obj);
36 JSONDecoder::decode_json("instance", instance, obj);
37}
38
39void rgw_bucket_dir_entry_meta::generate_test_instances(list<rgw_bucket_dir_entry_meta*>& o)
40{
41 rgw_bucket_dir_entry_meta *m = new rgw_bucket_dir_entry_meta;
42 m->category = 1;
43 m->size = 100;
44 m->etag = "etag";
45 m->owner = "owner";
46 m->owner_display_name = "display name";
47 m->content_type = "content/type";
48 o.push_back(m);
49 o.push_back(new rgw_bucket_dir_entry_meta);
50}
51
52void rgw_bucket_dir_entry_meta::dump(Formatter *f) const
53{
54 encode_json("category", (int)category, f);
55 encode_json("size", size, f);
56 utime_t ut(mtime);
57 encode_json("mtime", ut, f);
58 encode_json("etag", etag, f);
59 encode_json("owner", owner, f);
60 encode_json("owner_display_name", owner_display_name, f);
61 encode_json("content_type", content_type, f);
62 encode_json("accounted_size", accounted_size, f);
63 encode_json("user_data", user_data, f);
64}
65
66void rgw_bucket_dir_entry_meta::decode_json(JSONObj *obj) {
67 int val;
68 JSONDecoder::decode_json("category", val, obj);
69 category = (uint8_t)val;
70 JSONDecoder::decode_json("size", size, obj);
71 utime_t ut(mtime);
72 JSONDecoder::decode_json("mtime", ut, obj);
73 JSONDecoder::decode_json("etag", etag, obj);
74 JSONDecoder::decode_json("owner", owner, obj);
75 JSONDecoder::decode_json("owner_display_name", owner_display_name, obj);
76 JSONDecoder::decode_json("content_type", content_type, obj);
77 JSONDecoder::decode_json("accounted_size", accounted_size, obj);
78 JSONDecoder::decode_json("user_data", user_data, obj);
79}
80
81void rgw_bucket_dir_entry::generate_test_instances(list<rgw_bucket_dir_entry*>& o)
82{
83 list<rgw_bucket_dir_entry_meta *> l;
84 rgw_bucket_dir_entry_meta::generate_test_instances(l);
85
86 list<rgw_bucket_dir_entry_meta *>::iterator iter;
87 for (iter = l.begin(); iter != l.end(); ++iter) {
88 rgw_bucket_dir_entry_meta *m = *iter;
89 rgw_bucket_dir_entry *e = new rgw_bucket_dir_entry;
90 e->key.name = "name";
91 e->ver.pool = 1;
92 e->ver.epoch = 1234;
93 e->locator = "locator";
94 e->exists = true;
95 e->meta = *m;
96 e->tag = "tag";
97
98 o.push_back(e);
99
100 delete m;
101 }
102 o.push_back(new rgw_bucket_dir_entry);
103}
104
105void rgw_bucket_entry_ver::dump(Formatter *f) const
106{
107 encode_json("pool", pool, f);
108 encode_json("epoch", epoch, f);
109}
110
111void rgw_bucket_entry_ver::decode_json(JSONObj *obj) {
112 JSONDecoder::decode_json("pool", pool, obj);
113 JSONDecoder::decode_json("epoch", epoch, obj);
114}
115
116void rgw_bucket_entry_ver::generate_test_instances(list<rgw_bucket_entry_ver*>& ls)
117{
118 ls.push_back(new rgw_bucket_entry_ver);
119 ls.push_back(new rgw_bucket_entry_ver);
120 ls.back()->pool = 123;
121 ls.back()->epoch = 12322;
122}
123
124
125void rgw_bucket_dir_entry::dump(Formatter *f) const
126{
127 encode_json("name", key.name, f);
128 encode_json("instance", key.instance , f);
129 encode_json("ver", ver , f);
130 encode_json("locator", locator , f);
131 encode_json("exists", exists , f);
132 encode_json("meta", meta , f);
133 encode_json("tag", tag , f);
134 encode_json("flags", (int)flags , f);
135 encode_json("pending_map", pending_map, f);
136 encode_json("versioned_epoch", versioned_epoch , f);
137}
138
139void rgw_bucket_dir_entry::decode_json(JSONObj *obj) {
140 JSONDecoder::decode_json("name", key.name, obj);
141 JSONDecoder::decode_json("instance", key.instance , obj);
142 JSONDecoder::decode_json("ver", ver , obj);
143 JSONDecoder::decode_json("locator", locator , obj);
144 JSONDecoder::decode_json("exists", exists , obj);
145 JSONDecoder::decode_json("meta", meta , obj);
146 JSONDecoder::decode_json("tag", tag , obj);
147 int val;
148 JSONDecoder::decode_json("flags", val , obj);
149 flags = (uint16_t)val;
150 JSONDecoder::decode_json("pending_map", pending_map, obj);
151 JSONDecoder::decode_json("versioned_epoch", versioned_epoch, obj);
152}
153
154static void dump_bi_entry(bufferlist bl, BIIndexType index_type, Formatter *formatter)
155{
156 bufferlist::iterator iter = bl.begin();
157 switch (index_type) {
158 case PlainIdx:
159 case InstanceIdx:
160 {
161 rgw_bucket_dir_entry entry;
162 ::decode(entry, iter);
163 encode_json("entry", entry, formatter);
164 }
165 break;
166 case OLHIdx:
167 {
168 rgw_bucket_olh_entry entry;
169 ::decode(entry, iter);
170 encode_json("entry", entry, formatter);
171 }
172 break;
173 default:
174 break;
175 }
176}
177
178void rgw_cls_bi_entry::decode_json(JSONObj *obj, cls_rgw_obj_key *effective_key) {
179 JSONDecoder::decode_json("idx", idx, obj);
180 string s;
181 JSONDecoder::decode_json("type", s, obj);
182 if (s == "plain") {
183 type = PlainIdx;
184 } else if (s == "instance") {
185 type = InstanceIdx;
186 } else if (s == "olh") {
187 type = OLHIdx;
188 } else {
189 type = InvalidIdx;
190 }
191 switch (type) {
192 case PlainIdx:
193 case InstanceIdx:
194 {
195 rgw_bucket_dir_entry entry;
196 JSONDecoder::decode_json("entry", entry, obj);
197 ::encode(entry, data);
198
199 if (effective_key) {
200 *effective_key = entry.key;
201 }
202 }
203 break;
204 case OLHIdx:
205 {
206 rgw_bucket_olh_entry entry;
207 JSONDecoder::decode_json("entry", entry, obj);
208 ::encode(entry, data);
209
210 if (effective_key) {
211 *effective_key = entry.key;
212 }
213 }
214 break;
215 default:
216 break;
217 }
218}
219
220void rgw_cls_bi_entry::dump(Formatter *f) const
221{
222 string type_str;
223 switch (type) {
224 case PlainIdx:
225 type_str = "plain";
226 break;
227 case InstanceIdx:
228 type_str = "instance";
229 break;
230 case OLHIdx:
231 type_str = "olh";
232 break;
233 default:
234 type_str = "invalid";
235 }
236 encode_json("type", type_str, f);
237 encode_json("idx", idx, f);
238 dump_bi_entry(data, type, f);
239}
240
241bool rgw_cls_bi_entry::get_info(cls_rgw_obj_key *key, uint8_t *category, rgw_bucket_category_stats *accounted_stats)
242{
243 bool account = false;
244 bufferlist::iterator iter = data.begin();
245 switch (type) {
246 case PlainIdx:
247 case InstanceIdx:
248 {
249 rgw_bucket_dir_entry entry;
250 ::decode(entry, iter);
251 *key = entry.key;
252 *category = entry.meta.category;
253 accounted_stats->num_entries++;
254 accounted_stats->total_size += entry.meta.accounted_size;
255 accounted_stats->total_size_rounded += cls_rgw_get_rounded_size(entry.meta.accounted_size);
256 account = true;
257 }
258 break;
259 case OLHIdx:
260 {
261 rgw_bucket_olh_entry entry;
262 ::decode(entry, iter);
263 *key = entry.key;
264 }
265 break;
266 default:
267 break;
268 }
269
270 return account;
271}
272
273void rgw_bucket_olh_entry::dump(Formatter *f) const
274{
275 encode_json("key", key, f);
276 encode_json("delete_marker", delete_marker, f);
277 encode_json("epoch", epoch, f);
278 encode_json("pending_log", pending_log, f);
279 encode_json("tag", tag, f);
280 encode_json("exists", exists, f);
281 encode_json("pending_removal", pending_removal, f);
282}
283
284void rgw_bucket_olh_entry::decode_json(JSONObj *obj)
285{
286 JSONDecoder::decode_json("key", key, obj);
287 JSONDecoder::decode_json("delete_marker", delete_marker, obj);
288 JSONDecoder::decode_json("epoch", epoch, obj);
289 JSONDecoder::decode_json("pending_log", pending_log, obj);
290 JSONDecoder::decode_json("tag", tag, obj);
291 JSONDecoder::decode_json("exists", exists, obj);
292 JSONDecoder::decode_json("pending_removal", pending_removal, obj);
293}
294
295void rgw_bucket_olh_log_entry::generate_test_instances(list<rgw_bucket_olh_log_entry*>& o)
296{
297 rgw_bucket_olh_log_entry *entry = new rgw_bucket_olh_log_entry;
298 entry->epoch = 1234;
299 entry->op = CLS_RGW_OLH_OP_LINK_OLH;
300 entry->op_tag = "op_tag";
301 entry->key.name = "key.name";
302 entry->key.instance = "key.instance";
303 entry->delete_marker = true;
304 o.push_back(entry);
305 o.push_back(new rgw_bucket_olh_log_entry);
306}
307
308void rgw_bucket_olh_log_entry::dump(Formatter *f) const
309{
310 encode_json("epoch", epoch, f);
311 const char *op_str;
312 switch (op) {
313 case CLS_RGW_OLH_OP_LINK_OLH:
314 op_str = "link_olh";
315 break;
316 case CLS_RGW_OLH_OP_UNLINK_OLH:
317 op_str = "unlink_olh";
318 break;
319 case CLS_RGW_OLH_OP_REMOVE_INSTANCE:
320 op_str = "remove_instance";
321 break;
322 default:
323 op_str = "unknown";
324 }
325 encode_json("op", op_str, f);
326 encode_json("op_tag", op_tag, f);
327 encode_json("key", key, f);
328 encode_json("delete_marker", delete_marker, f);
329}
330
331void rgw_bucket_olh_log_entry::decode_json(JSONObj *obj)
332{
333 JSONDecoder::decode_json("epoch", epoch, obj);
334 string op_str;
335 JSONDecoder::decode_json("op", op_str, obj);
336 if (op_str == "link_olh") {
337 op = CLS_RGW_OLH_OP_LINK_OLH;
338 } else if (op_str == "unlink_olh") {
339 op = CLS_RGW_OLH_OP_UNLINK_OLH;
340 } else if (op_str == "remove_instance") {
341 op = CLS_RGW_OLH_OP_REMOVE_INSTANCE;
342 } else {
343 op = CLS_RGW_OLH_OP_UNKNOWN;
344 }
345 JSONDecoder::decode_json("op_tag", op_tag, obj);
346 JSONDecoder::decode_json("key", key, obj);
347 JSONDecoder::decode_json("delete_marker", delete_marker, obj);
348}
349void rgw_bi_log_entry::decode_json(JSONObj *obj)
350{
351 JSONDecoder::decode_json("op_id", id, obj);
352 JSONDecoder::decode_json("op_tag", tag, obj);
353 string op_str;
354 JSONDecoder::decode_json("op", op_str, obj);
355 if (op_str == "write") {
356 op = CLS_RGW_OP_ADD;
357 } else if (op_str == "del") {
358 op = CLS_RGW_OP_DEL;
359 } else if (op_str == "cancel") {
360 op = CLS_RGW_OP_CANCEL;
361 } else if (op_str == "unknown") {
362 op = CLS_RGW_OP_UNKNOWN;
363 } else if (op_str == "link_olh") {
364 op = CLS_RGW_OP_LINK_OLH;
365 } else if (op_str == "link_olh_del") {
366 op = CLS_RGW_OP_LINK_OLH_DM;
367 } else if (op_str == "unlink_instance") {
368 op = CLS_RGW_OP_UNLINK_INSTANCE;
c07f9fc5
FG
369 } else if (op_str == "syncstop") {
370 op = CLS_RGW_OP_SYNCSTOP;
371 } else if (op_str == "resync") {
372 op = CLS_RGW_OP_RESYNC;
7c673cae
FG
373 } else {
374 op = CLS_RGW_OP_UNKNOWN;
375 }
376 JSONDecoder::decode_json("object", object, obj);
377 JSONDecoder::decode_json("instance", instance, obj);
378 string state_str;
379 JSONDecoder::decode_json("state", state_str, obj);
380 if (state_str == "pending") {
381 state = CLS_RGW_STATE_PENDING_MODIFY;
382 } else if (state_str == "complete") {
383 state = CLS_RGW_STATE_COMPLETE;
384 } else {
385 state = CLS_RGW_STATE_UNKNOWN;
386 }
387 JSONDecoder::decode_json("index_ver", index_ver, obj);
388 utime_t ut;
389 JSONDecoder::decode_json("timestamp", ut, obj);
390 timestamp = ut.to_real_time();
391 uint32_t f;
392 JSONDecoder::decode_json("bilog_flags", f, obj);
393 JSONDecoder::decode_json("ver", ver, obj);
394 bilog_flags = (uint16_t)f;
395 JSONDecoder::decode_json("owner", owner, obj);
396 JSONDecoder::decode_json("owner_display_name", owner_display_name, obj);
31f18b77 397 JSONDecoder::decode_json("zones_trace", zones_trace, obj);
7c673cae
FG
398}
399
400void rgw_bi_log_entry::dump(Formatter *f) const
401{
402 f->dump_string("op_id", id);
403 f->dump_string("op_tag", tag);
404 switch (op) {
405 case CLS_RGW_OP_ADD:
406 f->dump_string("op", "write");
407 break;
408 case CLS_RGW_OP_DEL:
409 f->dump_string("op", "del");
410 break;
411 case CLS_RGW_OP_CANCEL:
412 f->dump_string("op", "cancel");
413 break;
414 case CLS_RGW_OP_UNKNOWN:
415 f->dump_string("op", "unknown");
416 break;
417 case CLS_RGW_OP_LINK_OLH:
418 f->dump_string("op", "link_olh");
419 break;
420 case CLS_RGW_OP_LINK_OLH_DM:
421 f->dump_string("op", "link_olh_del");
422 break;
423 case CLS_RGW_OP_UNLINK_INSTANCE:
424 f->dump_string("op", "unlink_instance");
425 break;
c07f9fc5
FG
426 case CLS_RGW_OP_SYNCSTOP:
427 f->dump_string("op", "syncstop");
428 break;
429 case CLS_RGW_OP_RESYNC:
430 f->dump_string("op", "resync");
431 break;
7c673cae
FG
432 default:
433 f->dump_string("op", "invalid");
434 break;
435 }
436
437 f->dump_string("object", object);
438 f->dump_string("instance", instance);
439
440 switch (state) {
441 case CLS_RGW_STATE_PENDING_MODIFY:
442 f->dump_string("state", "pending");
443 break;
444 case CLS_RGW_STATE_COMPLETE:
445 f->dump_string("state", "complete");
446 break;
447 default:
448 f->dump_string("state", "invalid");
449 break;
450 }
451
452 f->dump_int("index_ver", index_ver);
453 utime_t ut(timestamp);
454 ut.gmtime_nsec(f->dump_stream("timestamp"));
455 f->open_object_section("ver");
456 ver.dump(f);
457 f->close_section();
458 f->dump_int("bilog_flags", bilog_flags);
459 f->dump_bool("versioned", (bilog_flags & RGW_BILOG_FLAG_VERSIONED_OP) != 0);
460 f->dump_string("owner", owner);
461 f->dump_string("owner_display_name", owner_display_name);
31f18b77 462 encode_json("zones_trace", zones_trace, f);
7c673cae
FG
463}
464
465void rgw_bi_log_entry::generate_test_instances(list<rgw_bi_log_entry*>& ls)
466{
467 ls.push_back(new rgw_bi_log_entry);
468 ls.push_back(new rgw_bi_log_entry);
469 ls.back()->id = "midf";
470 ls.back()->object = "obj";
471 ls.back()->timestamp = ceph::real_clock::from_ceph_timespec({2, 3});
472 ls.back()->index_ver = 4323;
473 ls.back()->tag = "tagasdfds";
474 ls.back()->op = CLS_RGW_OP_DEL;
475 ls.back()->state = CLS_RGW_STATE_PENDING_MODIFY;
476}
477
478void rgw_bucket_category_stats::generate_test_instances(list<rgw_bucket_category_stats*>& o)
479{
480 rgw_bucket_category_stats *s = new rgw_bucket_category_stats;
481 s->total_size = 1024;
482 s->total_size_rounded = 4096;
483 s->num_entries = 2;
484 s->actual_size = 1024;
485 o.push_back(s);
486 o.push_back(new rgw_bucket_category_stats);
487}
488
489void rgw_bucket_category_stats::dump(Formatter *f) const
490{
491 f->dump_unsigned("total_size", total_size);
492 f->dump_unsigned("total_size_rounded", total_size_rounded);
493 f->dump_unsigned("num_entries", num_entries);
494 f->dump_unsigned("actual_size", actual_size);
495}
496
497void rgw_bucket_dir_header::generate_test_instances(list<rgw_bucket_dir_header*>& o)
498{
499 list<rgw_bucket_category_stats *> l;
500 list<rgw_bucket_category_stats *>::iterator iter;
501 rgw_bucket_category_stats::generate_test_instances(l);
502
503 uint8_t i;
504 for (i = 0, iter = l.begin(); iter != l.end(); ++iter, ++i) {
505 rgw_bucket_dir_header *h = new rgw_bucket_dir_header;
506 rgw_bucket_category_stats *s = *iter;
507 h->stats[i] = *s;
508
509 o.push_back(h);
510
511 delete s;
512 }
513
514 o.push_back(new rgw_bucket_dir_header);
515}
516
517void rgw_bucket_dir_header::dump(Formatter *f) const
518{
519 f->dump_int("ver", ver);
520 f->dump_int("master_ver", master_ver);
521 map<uint8_t, struct rgw_bucket_category_stats>::const_iterator iter = stats.begin();
522 f->open_array_section("stats");
523 for (; iter != stats.end(); ++iter) {
524 f->dump_int("category", (int)iter->first);
525 f->open_object_section("category_stats");
526 iter->second.dump(f);
527 f->close_section();
528 }
31f18b77 529 ::encode_json("new_instance", new_instance, f);
7c673cae
FG
530 f->close_section();
531}
532
533void rgw_bucket_dir::generate_test_instances(list<rgw_bucket_dir*>& o)
534{
535 list<rgw_bucket_dir_header *> l;
536 list<rgw_bucket_dir_header *>::iterator iter;
537 rgw_bucket_dir_header::generate_test_instances(l);
538
539 uint8_t i;
540 for (i = 0, iter = l.begin(); iter != l.end(); ++iter, ++i) {
541 rgw_bucket_dir *d = new rgw_bucket_dir;
542 rgw_bucket_dir_header *h = *iter;
543 d->header = *h;
544
545 list<rgw_bucket_dir_entry *> el;
546 list<rgw_bucket_dir_entry *>::iterator eiter;
547 for (eiter = el.begin(); eiter != el.end(); ++eiter) {
548 rgw_bucket_dir_entry *e = *eiter;
549 d->m[e->key.name] = *e;
550
551 delete e;
552 }
553
554 o.push_back(d);
555
556 delete h;
557 }
558
559 o.push_back(new rgw_bucket_dir);
560}
561
562void rgw_bucket_dir::dump(Formatter *f) const
563{
564 f->open_object_section("header");
565 header.dump(f);
566 f->close_section();
567 map<string, struct rgw_bucket_dir_entry>::const_iterator iter = m.begin();
568 f->open_array_section("map");
569 for (; iter != m.end(); ++iter) {
570 f->dump_string("key", iter->first);
571 f->open_object_section("dir_entry");
572 iter->second.dump(f);
573 f->close_section();
574 }
575 f->close_section();
576}
577
31f18b77
FG
578void cls_rgw_reshard_entry::generate_key(const string& tenant, const string& bucket_name, string *key)
579{
580 *key = tenant + ":" + bucket_name;
581}
582
583void cls_rgw_reshard_entry::get_key(string *key) const
584{
585 generate_key(tenant, bucket_name, key);
586}
587
588void cls_rgw_reshard_entry::dump(Formatter *f) const
589{
590 utime_t ut(time);
591 encode_json("time",ut, f);
592 encode_json("tenant", tenant, f);
593 encode_json("bucket_name", bucket_name, f);
594 encode_json("bucket_id", bucket_id, f);
595 encode_json("new_instance_id", new_instance_id, f);
596 encode_json("old_num_shards", old_num_shards, f);
597 encode_json("new_num_shards", new_num_shards, f);
598
599}
600
601void cls_rgw_reshard_entry::generate_test_instances(list<cls_rgw_reshard_entry*>& ls)
602{
603 ls.push_back(new cls_rgw_reshard_entry);
604 ls.push_back(new cls_rgw_reshard_entry);
605 ls.back()->time = ceph::real_clock::from_ceph_timespec({2, 3});
606 ls.back()->tenant = "tenant";
607 ls.back()->bucket_name = "bucket1""";
608 ls.back()->bucket_id = "bucket_id";
609 ls.back()->new_instance_id = "new_instance_id";
610 ls.back()->old_num_shards = 8;
611 ls.back()->new_num_shards = 64;
612}
613
614void cls_rgw_bucket_instance_entry::dump(Formatter *f) const
615{
1adf2230
AA
616 string status_str;
617 switch(reshard_status) {
618 case CLS_RGW_RESHARD_NONE:
619 status_str= "none";
620 break;
621 case CLS_RGW_RESHARD_IN_PROGRESS:
622 status_str = "in-progress";
623 break;
624 case CLS_RGW_RESHARD_DONE:
625 status_str = "done";
626 break;
627 default:
628 status_str = "invalid";
629 }
630 encode_json("reshard_status", status_str, f);
31f18b77
FG
631 encode_json("new_bucket_instance_id", new_bucket_instance_id, f);
632 encode_json("num_shards", num_shards, f);
633
634}
635
636void cls_rgw_bucket_instance_entry::generate_test_instances(list<cls_rgw_bucket_instance_entry*>& ls)
637{
638 ls.push_back(new cls_rgw_bucket_instance_entry);
639 ls.push_back(new cls_rgw_bucket_instance_entry);
640 ls.back()->reshard_status = CLS_RGW_RESHARD_IN_PROGRESS;
641 ls.back()->new_bucket_instance_id = "new_instance_id";
642}