]>
Commit | Line | Data |
---|---|---|
f64942e4 AA |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
7c673cae FG |
4 | #ifndef CEPH_CLS_LOCK_TYPES_H |
5 | #define CEPH_CLS_LOCK_TYPES_H | |
6 | ||
7 | #include "include/encoding.h" | |
8 | #include "include/types.h" | |
9 | #include "include/utime.h" | |
10 | #include "msg/msg_types.h" | |
11 | ||
12 | /* lock flags */ | |
f64942e4 AA |
13 | #define LOCK_FLAG_MAY_RENEW 0x1 /* idempotent lock acquire */ |
14 | #define LOCK_FLAG_MUST_RENEW 0x2 /* lock must already be acquired */ | |
7c673cae FG |
15 | |
16 | enum ClsLockType { | |
f64942e4 AA |
17 | LOCK_NONE = 0, |
18 | LOCK_EXCLUSIVE = 1, | |
19 | LOCK_SHARED = 2, | |
20 | LOCK_EXCLUSIVE_EPHEMERAL = 3, /* lock object is removed @ unlock */ | |
7c673cae FG |
21 | }; |
22 | ||
11fdf7f2 | 23 | inline const char *cls_lock_type_str(ClsLockType type) |
7c673cae FG |
24 | { |
25 | switch (type) { | |
26 | case LOCK_NONE: | |
27 | return "none"; | |
28 | case LOCK_EXCLUSIVE: | |
29 | return "exclusive"; | |
30 | case LOCK_SHARED: | |
31 | return "shared"; | |
f64942e4 AA |
32 | case LOCK_EXCLUSIVE_EPHEMERAL: |
33 | return "exclusive-ephemeral"; | |
7c673cae FG |
34 | default: |
35 | return "<unknown>"; | |
36 | } | |
37 | } | |
38 | ||
f64942e4 AA |
39 | inline bool cls_lock_is_exclusive(ClsLockType type) { |
40 | return LOCK_EXCLUSIVE == type || LOCK_EXCLUSIVE_EPHEMERAL == type; | |
41 | } | |
42 | ||
43 | inline bool cls_lock_is_ephemeral(ClsLockType type) { | |
44 | return LOCK_EXCLUSIVE_EPHEMERAL == type; | |
45 | } | |
46 | ||
47 | inline bool cls_lock_is_valid(ClsLockType type) { | |
48 | return LOCK_SHARED == type || | |
49 | LOCK_EXCLUSIVE == type || | |
50 | LOCK_EXCLUSIVE_EPHEMERAL == type; | |
51 | } | |
52 | ||
7c673cae FG |
53 | namespace rados { |
54 | namespace cls { | |
55 | namespace lock { | |
56 | ||
57 | /* | |
58 | * locker_id_t: the locker id, needs to be unique in a single lock | |
59 | */ | |
60 | struct locker_id_t { | |
61 | entity_name_t locker; // locker's client name | |
9f95a23c | 62 | std::string cookie; // locker's cookie. |
7c673cae FG |
63 | |
64 | locker_id_t() {} | |
9f95a23c | 65 | locker_id_t(entity_name_t& _n, const std::string& _c) : locker(_n), cookie(_c) {} |
7c673cae | 66 | |
9f95a23c | 67 | void encode(ceph::buffer::list &bl) const { |
7c673cae | 68 | ENCODE_START(1, 1, bl); |
11fdf7f2 TL |
69 | encode(locker, bl); |
70 | encode(cookie, bl); | |
7c673cae FG |
71 | ENCODE_FINISH(bl); |
72 | } | |
9f95a23c | 73 | void decode(ceph::buffer::list::const_iterator &bl) { |
7c673cae | 74 | DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl); |
11fdf7f2 TL |
75 | decode(locker, bl); |
76 | decode(cookie, bl); | |
7c673cae FG |
77 | DECODE_FINISH(bl); |
78 | } | |
79 | ||
80 | bool operator<(const locker_id_t& rhs) const { | |
81 | if (locker == rhs.locker) | |
82 | return cookie.compare(rhs.cookie) < 0; | |
83 | if (locker < rhs.locker) | |
84 | return true; | |
85 | return false; | |
86 | } | |
87 | void dump(Formatter *f) const; | |
81eedcae TL |
88 | friend std::ostream& operator<<(std::ostream& out, |
89 | const locker_id_t& data) { | |
90 | out << data.locker; | |
91 | return out; | |
92 | } | |
7c673cae FG |
93 | static void generate_test_instances(list<locker_id_t*>& o); |
94 | }; | |
11fdf7f2 | 95 | WRITE_CLASS_ENCODER(locker_id_t) |
7c673cae FG |
96 | |
97 | struct locker_info_t | |
98 | { | |
99 | utime_t expiration; // expiration: non-zero means epoch of locker expiration | |
100 | entity_addr_t addr; // addr: locker address | |
9f95a23c | 101 | std::string description; // description: locker description, may be empty |
7c673cae FG |
102 | |
103 | locker_info_t() {} | |
104 | locker_info_t(const utime_t& _e, const entity_addr_t& _a, | |
9f95a23c | 105 | const std::string& _d) : expiration(_e), addr(_a), description(_d) {} |
7c673cae | 106 | |
9f95a23c | 107 | void encode(ceph::buffer::list &bl, uint64_t features) const { |
7c673cae | 108 | ENCODE_START(1, 1, bl); |
11fdf7f2 TL |
109 | encode(expiration, bl); |
110 | encode(addr, bl, features); | |
111 | encode(description, bl); | |
7c673cae FG |
112 | ENCODE_FINISH(bl); |
113 | } | |
9f95a23c | 114 | void decode(ceph::buffer::list::const_iterator &bl) { |
7c673cae | 115 | DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl); |
11fdf7f2 TL |
116 | decode(expiration, bl); |
117 | decode(addr, bl); | |
118 | decode(description, bl); | |
7c673cae FG |
119 | DECODE_FINISH(bl); |
120 | } | |
121 | void dump(Formatter *f) const; | |
81eedcae TL |
122 | friend std::ostream& operator<<(std::ostream& out, |
123 | const locker_info_t& data) { | |
124 | out << "{addr:" << data.addr << ", exp:"; | |
125 | ||
126 | const auto& exp = data.expiration; | |
127 | if (exp.is_zero()) { | |
128 | out << "never}"; | |
129 | } else { | |
130 | out << exp.to_real_time() << "}"; | |
131 | } | |
132 | ||
133 | return out; | |
134 | } | |
7c673cae FG |
135 | static void generate_test_instances(list<locker_info_t *>& o); |
136 | }; | |
11fdf7f2 | 137 | WRITE_CLASS_ENCODER_FEATURES(locker_info_t) |
224ce89b WB |
138 | |
139 | struct lock_info_t { | |
140 | map<locker_id_t, locker_info_t> lockers; // map of lockers | |
141 | ClsLockType lock_type; // lock type (exclusive / shared) | |
9f95a23c | 142 | std::string tag; // tag: operations on lock can only succeed with this tag |
224ce89b WB |
143 | // as long as set of non expired lockers |
144 | // is bigger than 0. | |
145 | ||
9f95a23c | 146 | void encode(ceph::buffer::list &bl, uint64_t features) const { |
224ce89b | 147 | ENCODE_START(1, 1, bl); |
11fdf7f2 | 148 | encode(lockers, bl, features); |
224ce89b | 149 | uint8_t t = (uint8_t)lock_type; |
11fdf7f2 TL |
150 | encode(t, bl); |
151 | encode(tag, bl); | |
224ce89b WB |
152 | ENCODE_FINISH(bl); |
153 | } | |
9f95a23c | 154 | void decode(ceph::buffer::list::const_iterator &bl) { |
224ce89b | 155 | DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl); |
11fdf7f2 | 156 | decode(lockers, bl); |
224ce89b | 157 | uint8_t t; |
11fdf7f2 | 158 | decode(t, bl); |
224ce89b | 159 | lock_type = (ClsLockType)t; |
11fdf7f2 | 160 | decode(tag, bl); |
224ce89b WB |
161 | DECODE_FINISH(bl); |
162 | } | |
163 | lock_info_t() : lock_type(LOCK_NONE) {} | |
164 | void dump(Formatter *f) const; | |
165 | static void generate_test_instances(list<lock_info_t *>& o); | |
166 | }; | |
11fdf7f2 | 167 | WRITE_CLASS_ENCODER_FEATURES(lock_info_t); |
7c673cae FG |
168 | } |
169 | } | |
170 | } | |
7c673cae FG |
171 | |
172 | #endif |