1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
6 #include "include/types.h"
7 #include "include/rados/librados.hpp"
8 #include "common/ceph_mutex.h"
9 #include "common/Cond.h"
10 #include "common/Thread.h"
11 #include "rgw_common.h"
13 #include "rgw_rados.h"
14 #include "cls/rgw/cls_rgw_types.h"
20 class RGWGC
: public DoutPrefixProvider
{
24 std::string
*obj_names
;
25 std::atomic
<bool> down_flag
= { false };
27 static constexpr uint64_t seed
= 8675309;
29 int tag_index(const std::string
& tag
);
30 int send_chain(const cls_rgw_obj_chain
& chain
, const std::string
& tag
);
32 class GCWorker
: public Thread
{
33 const DoutPrefixProvider
*dpp
;
36 ceph::mutex lock
= ceph::make_mutex("GCWorker");
37 ceph::condition_variable cond
;
40 GCWorker(const DoutPrefixProvider
*_dpp
, CephContext
*_cct
, RGWGC
*_gc
) : dpp(_dpp
), cct(_cct
), gc(_gc
) {}
41 void *entry() override
;
47 RGWGC() : cct(NULL
), store(NULL
), max_objs(0), obj_names(NULL
), worker(NULL
) {}
52 std::vector
<bool> transitioned_objects_cache
;
53 std::tuple
<int, std::optional
<cls_rgw_obj_chain
>> send_split_chain(const cls_rgw_obj_chain
& chain
, const std::string
& tag
);
55 // asynchronously defer garbage collection on an object that's still being read
56 int async_defer_chain(const std::string
& tag
, const cls_rgw_obj_chain
& info
);
58 // callback for when async_defer_chain() fails with ECANCELED
59 void on_defer_canceled(const cls_rgw_gc_obj_info
& info
);
61 int remove(int index
, const std::vector
<std::string
>& tags
, librados::AioCompletion
**pc
);
62 int remove(int index
, int num_entries
);
64 void initialize(CephContext
*_cct
, RGWRados
*_store
);
67 int list(int *index
, std::string
& marker
, uint32_t max
, bool expired_only
, std::list
<cls_rgw_gc_obj_info
>& result
, bool *truncated
, bool& processing_queue
);
68 void list_init(int *index
) { *index
= 0; }
69 int process(int index
, int process_max_secs
, bool expired_only
,
70 RGWGCIOManager
& io_manager
);
71 int process(bool expired_only
);
74 void start_processor();
75 void stop_processor();
77 CephContext
*get_cct() const override
{ return store
->ctx(); }
78 unsigned get_subsys() const;
80 std::ostream
& gen_prefix(std::ostream
& out
) const;