]> git.proxmox.com Git - ceph.git/blob - ceph/src/cls/lock/cls_lock_types.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / cls / lock / cls_lock_types.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
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 */
13 #define LOCK_FLAG_MAY_RENEW 0x1 /* idempotent lock acquire */
14 #define LOCK_FLAG_MUST_RENEW 0x2 /* lock must already be acquired */
15
16 enum ClsLockType {
17 LOCK_NONE = 0,
18 LOCK_EXCLUSIVE = 1,
19 LOCK_SHARED = 2,
20 LOCK_EXCLUSIVE_EPHEMERAL = 3, /* lock object is removed @ unlock */
21 };
22
23 inline const char *cls_lock_type_str(ClsLockType type)
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";
32 case LOCK_EXCLUSIVE_EPHEMERAL:
33 return "exclusive-ephemeral";
34 default:
35 return "<unknown>";
36 }
37 }
38
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
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
62 string cookie; // locker's cookie.
63
64 locker_id_t() {}
65 locker_id_t(entity_name_t& _n, const string& _c) : locker(_n), cookie(_c) {}
66
67 void encode(bufferlist &bl) const {
68 ENCODE_START(1, 1, bl);
69 encode(locker, bl);
70 encode(cookie, bl);
71 ENCODE_FINISH(bl);
72 }
73 void decode(bufferlist::const_iterator &bl) {
74 DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl);
75 decode(locker, bl);
76 decode(cookie, bl);
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;
88 static void generate_test_instances(list<locker_id_t*>& o);
89 };
90 WRITE_CLASS_ENCODER(locker_id_t)
91
92 struct locker_info_t
93 {
94 utime_t expiration; // expiration: non-zero means epoch of locker expiration
95 entity_addr_t addr; // addr: locker address
96 string description; // description: locker description, may be empty
97
98 locker_info_t() {}
99 locker_info_t(const utime_t& _e, const entity_addr_t& _a,
100 const string& _d) : expiration(_e), addr(_a), description(_d) {}
101
102 void encode(bufferlist &bl, uint64_t features) const {
103 ENCODE_START(1, 1, bl);
104 encode(expiration, bl);
105 encode(addr, bl, features);
106 encode(description, bl);
107 ENCODE_FINISH(bl);
108 }
109 void decode(bufferlist::const_iterator &bl) {
110 DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl);
111 decode(expiration, bl);
112 decode(addr, bl);
113 decode(description, bl);
114 DECODE_FINISH(bl);
115 }
116 void dump(Formatter *f) const;
117 static void generate_test_instances(list<locker_info_t *>& o);
118 };
119 WRITE_CLASS_ENCODER_FEATURES(locker_info_t)
120
121 struct lock_info_t {
122 map<locker_id_t, locker_info_t> lockers; // map of lockers
123 ClsLockType lock_type; // lock type (exclusive / shared)
124 string tag; // tag: operations on lock can only succeed with this tag
125 // as long as set of non expired lockers
126 // is bigger than 0.
127
128 void encode(bufferlist &bl, uint64_t features) const {
129 ENCODE_START(1, 1, bl);
130 encode(lockers, bl, features);
131 uint8_t t = (uint8_t)lock_type;
132 encode(t, bl);
133 encode(tag, bl);
134 ENCODE_FINISH(bl);
135 }
136 void decode(bufferlist::const_iterator &bl) {
137 DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl);
138 decode(lockers, bl);
139 uint8_t t;
140 decode(t, bl);
141 lock_type = (ClsLockType)t;
142 decode(tag, bl);
143 DECODE_FINISH(bl);
144 }
145 lock_info_t() : lock_type(LOCK_NONE) {}
146 void dump(Formatter *f) const;
147 static void generate_test_instances(list<lock_info_t *>& o);
148 };
149 WRITE_CLASS_ENCODER_FEATURES(lock_info_t);
150 }
151 }
152 }
153
154 #endif