]>
git.proxmox.com Git - ceph.git/blob - ceph/src/osd/object_state.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
10 bool exists
; ///< the stored object exists (i.e., we will remember the object_info_t)
12 ObjectState() : exists(false) {}
14 ObjectState(const object_info_t
&oi_
, bool exists_
)
15 : oi(oi_
), exists(exists_
) {}
16 ObjectState(object_info_t
&&oi_
, bool exists_
)
17 : oi(std::move(oi_
)), exists(exists_
) {}
18 ObjectState(const hobject_t
&obj
) : oi(obj
), exists(false) {}
28 static const char *get_state_name(State s
) {
30 case RWNONE
: return "none";
31 case RWREAD
: return "read";
32 case RWWRITE
: return "write";
33 case RWEXCL
: return "excl";
34 default: return "???";
37 const char *get_state_name() const {
38 return get_state_name(state
);
41 int count
; ///< number of readers or writers
42 int waiters
= 0; ///< number waiting
44 State state
:4; ///< rw state
45 /// if set, restart backfill when we can get a read lock
46 bool recovery_read_marker
:1;
47 /// if set, requeue snaptrim on lock release
48 bool snaptrimmer_write_marker
:1;
53 recovery_read_marker(false),
54 snaptrimmer_write_marker(false)
57 /// this function adjusts the counts if necessary
58 bool get_read_lock() {
59 // don't starve anybody!
65 ceph_assert(count
== 0);
76 ceph_abort_msg("unhandled case");
81 bool get_write_lock(bool greedy
=false) {
83 // don't starve anybody!
85 recovery_read_marker
) {
91 ceph_assert(count
== 0);
102 ceph_abort_msg("unhandled case");
106 bool get_excl_lock() {
109 ceph_assert(count
== 0);
120 ceph_abort_msg("unhandled case");
124 /// same as get_write_lock, but ignore starvation
125 bool take_write_lock() {
126 if (state
== RWWRITE
) {
130 return get_write_lock();
133 ceph_assert(count
> 0);
143 ceph_assert(state
== RWREAD
);
147 ceph_assert(state
== RWWRITE
);
151 ceph_assert(state
== RWEXCL
);
157 void release_waiters() {
160 void dec_waiters(int count
) {
161 ceph_assert(waiters
>= count
);
164 bool empty() const { return state
== RWNONE
; }
166 bool get_snaptrimmer_write(bool mark_if_unsuccessful
) {
167 if (get_write_lock()) {
170 if (mark_if_unsuccessful
)
171 snaptrimmer_write_marker
= true;
175 bool get_recovery_read() {
176 recovery_read_marker
= true;
177 if (get_read_lock()) {
184 inline std::ostream
& operator<<(std::ostream
& out
, const RWState
& rw
)
186 return out
<< "rwstate(" << rw
.get_state_name()
188 << " w=" << rw
.waiters