1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
7 #include "rgw/rgw_service.h"
10 #include "svc_sys_obj_types.h"
14 struct RGWSI_SysObj_Core_GetObjState
: public RGWSI_SysObj_Obj_GetObjState
{
15 RGWSI_RADOS::Obj rados_obj
;
16 bool has_rados_obj
{false};
19 RGWSI_SysObj_Core_GetObjState() {}
21 int get_rados_obj(const DoutPrefixProvider
*dpp
,
22 RGWSI_RADOS
*rados_svc
,
24 const rgw_raw_obj
& obj
,
25 RGWSI_RADOS::Obj
**pobj
);
28 struct RGWSI_SysObj_Core_PoolListImplInfo
: public RGWSI_SysObj_Pool_ListInfo
{
29 RGWSI_RADOS::Pool pool
;
30 RGWSI_RADOS::Pool::List op
;
31 RGWAccessListFilterPrefix filter
;
33 RGWSI_SysObj_Core_PoolListImplInfo(const string
& prefix
) : op(pool
.op()), filter(prefix
) {}
36 struct RGWSysObjState
{
38 bool has_attrs
{false};
41 ceph::real_time mtime
;
46 bool prefetch_data
{false};
49 /* important! don't forget to update copy constructor */
51 RGWObjVersionTracker objv_tracker
;
53 map
<string
, bufferlist
> attrset
;
55 RGWSysObjState(const RGWSysObjState
& rhs
) : obj (rhs
.obj
) {
56 has_attrs
= rhs
.has_attrs
;
61 if (rhs
.obj_tag
.length()) {
62 obj_tag
= rhs
.obj_tag
;
64 has_data
= rhs
.has_data
;
65 if (rhs
.data
.length()) {
68 prefetch_data
= rhs
.prefetch_data
;
70 objv_tracker
= rhs
.objv_tracker
;
75 class RGWSysObjectCtxBase
{
76 std::map
<rgw_raw_obj
, RGWSysObjState
> objs_state
;
77 ceph::shared_mutex lock
= ceph::make_shared_mutex("RGWSysObjectCtxBase");
80 RGWSysObjectCtxBase() = default;
82 RGWSysObjectCtxBase(const RGWSysObjectCtxBase
& rhs
) : objs_state(rhs
.objs_state
) {}
83 RGWSysObjectCtxBase(RGWSysObjectCtxBase
&& rhs
) : objs_state(std::move(rhs
.objs_state
)) {}
85 RGWSysObjState
*get_state(const rgw_raw_obj
& obj
) {
86 RGWSysObjState
*result
;
87 std::map
<rgw_raw_obj
, RGWSysObjState
>::iterator iter
;
89 assert (!obj
.empty());
90 iter
= objs_state
.find(obj
);
91 if (iter
!= objs_state
.end()) {
92 result
= &iter
->second
;
97 result
= &objs_state
[obj
];
103 void set_prefetch_data(rgw_raw_obj
& obj
) {
104 std::unique_lock wl
{lock
};
105 assert (!obj
.empty());
106 objs_state
[obj
].prefetch_data
= true;
108 void invalidate(const rgw_raw_obj
& obj
) {
109 std::unique_lock wl
{lock
};
110 auto iter
= objs_state
.find(obj
);
111 if (iter
== objs_state
.end()) {
114 objs_state
.erase(iter
);