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(RGWSI_RADOS
*rados_svc
,
23 const rgw_raw_obj
& obj
,
24 RGWSI_RADOS::Obj
**pobj
);
27 struct RGWSI_SysObj_Core_PoolListImplInfo
: public RGWSI_SysObj_Pool_ListInfo
{
28 RGWSI_RADOS::Pool pool
;
29 RGWSI_RADOS::Pool::List op
;
30 RGWAccessListFilterPrefix filter
;
32 RGWSI_SysObj_Core_PoolListImplInfo(const string
& prefix
) : op(pool
.op()), filter(prefix
) {}
35 struct RGWSysObjState
{
37 bool has_attrs
{false};
40 ceph::real_time mtime
;
45 bool prefetch_data
{false};
48 /* important! don't forget to update copy constructor */
50 RGWObjVersionTracker objv_tracker
;
52 map
<string
, bufferlist
> attrset
;
54 RGWSysObjState(const RGWSysObjState
& rhs
) : obj (rhs
.obj
) {
55 has_attrs
= rhs
.has_attrs
;
60 if (rhs
.obj_tag
.length()) {
61 obj_tag
= rhs
.obj_tag
;
63 has_data
= rhs
.has_data
;
64 if (rhs
.data
.length()) {
67 prefetch_data
= rhs
.prefetch_data
;
69 objv_tracker
= rhs
.objv_tracker
;
74 class RGWSysObjectCtxBase
{
75 std::map
<rgw_raw_obj
, RGWSysObjState
> objs_state
;
76 ceph::shared_mutex lock
= ceph::make_shared_mutex("RGWSysObjectCtxBase");
79 RGWSysObjectCtxBase() = default;
81 RGWSysObjectCtxBase(const RGWSysObjectCtxBase
& rhs
) : objs_state(rhs
.objs_state
) {}
82 RGWSysObjectCtxBase(RGWSysObjectCtxBase
&& rhs
) : objs_state(std::move(rhs
.objs_state
)) {}
84 RGWSysObjState
*get_state(const rgw_raw_obj
& obj
) {
85 RGWSysObjState
*result
;
86 std::map
<rgw_raw_obj
, RGWSysObjState
>::iterator iter
;
88 assert (!obj
.empty());
89 iter
= objs_state
.find(obj
);
90 if (iter
!= objs_state
.end()) {
91 result
= &iter
->second
;
96 result
= &objs_state
[obj
];
102 void set_prefetch_data(rgw_raw_obj
& obj
) {
103 std::unique_lock wl
{lock
};
104 assert (!obj
.empty());
105 objs_state
[obj
].prefetch_data
= true;
107 void invalidate(const rgw_raw_obj
& obj
) {
108 std::unique_lock wl
{lock
};
109 auto iter
= objs_state
.find(obj
);
110 if (iter
== objs_state
.end()) {
113 objs_state
.erase(iter
);