]> git.proxmox.com Git - ceph.git/blob - ceph/src/cls/lock/cls_lock_types.h
update sources to v12.1.1
[ceph.git] / ceph / src / cls / lock / cls_lock_types.h
1 #ifndef CEPH_CLS_LOCK_TYPES_H
2 #define CEPH_CLS_LOCK_TYPES_H
3
4 #include "include/encoding.h"
5 #include "include/types.h"
6 #include "include/utime.h"
7 #include "msg/msg_types.h"
8
9 /* lock flags */
10 #define LOCK_FLAG_RENEW 0x1 /* idempotent lock acquire */
11
12 enum ClsLockType {
13 LOCK_NONE = 0,
14 LOCK_EXCLUSIVE = 1,
15 LOCK_SHARED = 2,
16 };
17
18 static inline const char *cls_lock_type_str(ClsLockType type)
19 {
20 switch (type) {
21 case LOCK_NONE:
22 return "none";
23 case LOCK_EXCLUSIVE:
24 return "exclusive";
25 case LOCK_SHARED:
26 return "shared";
27 default:
28 return "<unknown>";
29 }
30 }
31
32 namespace rados {
33 namespace cls {
34 namespace lock {
35
36 /*
37 * locker_id_t: the locker id, needs to be unique in a single lock
38 */
39 struct locker_id_t {
40 entity_name_t locker; // locker's client name
41 string cookie; // locker's cookie.
42
43 locker_id_t() {}
44 locker_id_t(entity_name_t& _n, const string& _c) : locker(_n), cookie(_c) {}
45
46 void encode(bufferlist &bl) const {
47 ENCODE_START(1, 1, bl);
48 ::encode(locker, bl);
49 ::encode(cookie, bl);
50 ENCODE_FINISH(bl);
51 }
52 void decode(bufferlist::iterator &bl) {
53 DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl);
54 ::decode(locker, bl);
55 ::decode(cookie, bl);
56 DECODE_FINISH(bl);
57 }
58
59 bool operator<(const locker_id_t& rhs) const {
60 if (locker == rhs.locker)
61 return cookie.compare(rhs.cookie) < 0;
62 if (locker < rhs.locker)
63 return true;
64 return false;
65 }
66 void dump(Formatter *f) const;
67 static void generate_test_instances(list<locker_id_t*>& o);
68 };
69 WRITE_CLASS_ENCODER(rados::cls::lock::locker_id_t)
70
71 struct locker_info_t
72 {
73 utime_t expiration; // expiration: non-zero means epoch of locker expiration
74 entity_addr_t addr; // addr: locker address
75 string description; // description: locker description, may be empty
76
77 locker_info_t() {}
78 locker_info_t(const utime_t& _e, const entity_addr_t& _a,
79 const string& _d) : expiration(_e), addr(_a), description(_d) {}
80
81 void encode(bufferlist &bl, uint64_t features) const {
82 ENCODE_START(1, 1, bl);
83 ::encode(expiration, bl);
84 ::encode(addr, bl, features);
85 ::encode(description, bl);
86 ENCODE_FINISH(bl);
87 }
88 void decode(bufferlist::iterator &bl) {
89 DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl);
90 ::decode(expiration, bl);
91 ::decode(addr, bl);
92 ::decode(description, bl);
93 DECODE_FINISH(bl);
94 }
95 void dump(Formatter *f) const;
96 static void generate_test_instances(list<locker_info_t *>& o);
97 };
98 WRITE_CLASS_ENCODER_FEATURES(rados::cls::lock::locker_info_t)
99
100 struct lock_info_t {
101 map<locker_id_t, locker_info_t> lockers; // map of lockers
102 ClsLockType lock_type; // lock type (exclusive / shared)
103 string tag; // tag: operations on lock can only succeed with this tag
104 // as long as set of non expired lockers
105 // is bigger than 0.
106
107 void encode(bufferlist &bl, uint64_t features) const {
108 ENCODE_START(1, 1, bl);
109 ::encode(lockers, bl, features);
110 uint8_t t = (uint8_t)lock_type;
111 ::encode(t, bl);
112 ::encode(tag, bl);
113 ENCODE_FINISH(bl);
114 }
115 void decode(bufferlist::iterator &bl) {
116 DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl);
117 ::decode(lockers, bl);
118 uint8_t t;
119 ::decode(t, bl);
120 lock_type = (ClsLockType)t;
121 ::decode(tag, bl);
122 DECODE_FINISH(bl);
123 }
124 lock_info_t() : lock_type(LOCK_NONE) {}
125 void dump(Formatter *f) const;
126 static void generate_test_instances(list<lock_info_t *>& o);
127 };
128 WRITE_CLASS_ENCODER_FEATURES(rados::cls::lock::lock_info_t)
129 }
130 }
131 }
132 WRITE_CLASS_ENCODER_FEATURES(rados::cls::lock::locker_info_t)
133 WRITE_CLASS_ENCODER(rados::cls::lock::locker_id_t)
134 WRITE_CLASS_ENCODER_FEATURES(rados::cls::lock::lock_info_t)
135
136 #endif