]>
git.proxmox.com Git - ceph.git/blob - ceph/src/cls/lock/cls_lock_types.h
13f3e147810845ff6522d687b6d91bd895806cd7
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_CLS_LOCK_TYPES_H
5 #define CEPH_CLS_LOCK_TYPES_H
7 #include "include/encoding.h"
8 #include "include/types.h"
9 #include "include/utime.h"
10 #include "msg/msg_types.h"
13 #define LOCK_FLAG_MAY_RENEW 0x1 /* idempotent lock acquire */
14 #define LOCK_FLAG_MUST_RENEW 0x2 /* lock must already be acquired */
16 enum class ClsLockType
{
20 EXCLUSIVE_EPHEMERAL
= 3, /* lock object is removed @ unlock */
23 inline const char *cls_lock_type_str(ClsLockType type
)
26 case ClsLockType::NONE
:
28 case ClsLockType::EXCLUSIVE
:
30 case ClsLockType::SHARED
:
32 case ClsLockType::EXCLUSIVE_EPHEMERAL
:
33 return "exclusive-ephemeral";
39 inline bool cls_lock_is_exclusive(ClsLockType type
) {
40 return ClsLockType::EXCLUSIVE
== type
|| ClsLockType::EXCLUSIVE_EPHEMERAL
== type
;
43 inline bool cls_lock_is_ephemeral(ClsLockType type
) {
44 return ClsLockType::EXCLUSIVE_EPHEMERAL
== type
;
47 inline bool cls_lock_is_valid(ClsLockType type
) {
48 return ClsLockType::SHARED
== type
||
49 ClsLockType::EXCLUSIVE
== type
||
50 ClsLockType::EXCLUSIVE_EPHEMERAL
== type
;
58 * locker_id_t: the locker id, needs to be unique in a single lock
61 entity_name_t locker
; // locker's client name
62 std::string cookie
; // locker's cookie.
65 locker_id_t(entity_name_t
& _n
, const std::string
& _c
) : locker(_n
), cookie(_c
) {}
67 void encode(ceph::buffer::list
&bl
) const {
68 ENCODE_START(1, 1, bl
);
73 void decode(ceph::buffer::list::const_iterator
&bl
) {
74 DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl
);
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
)
87 void dump(ceph::Formatter
*f
) const;
88 friend std::ostream
& operator<<(std::ostream
& out
,
89 const locker_id_t
& data
) {
93 static void generate_test_instances(std::list
<locker_id_t
*>& o
);
95 WRITE_CLASS_ENCODER(locker_id_t
)
99 utime_t expiration
; // expiration: non-zero means epoch of locker expiration
100 entity_addr_t addr
; // addr: locker address
101 std::string description
; // description: locker description, may be empty
104 locker_info_t(const utime_t
& _e
, const entity_addr_t
& _a
,
105 const std::string
& _d
) : expiration(_e
), addr(_a
), description(_d
) {}
107 void encode(ceph::buffer::list
&bl
, uint64_t features
) const {
108 ENCODE_START(1, 1, bl
);
109 encode(expiration
, bl
);
110 encode(addr
, bl
, features
);
111 encode(description
, bl
);
114 void decode(ceph::buffer::list::const_iterator
&bl
) {
115 DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl
);
116 decode(expiration
, bl
);
118 decode(description
, bl
);
121 void dump(ceph::Formatter
*f
) const;
122 friend std::ostream
& operator<<(std::ostream
& out
,
123 const locker_info_t
& data
) {
124 using ceph::operator <<;
125 out
<< "{addr:" << data
.addr
<< ", exp:";
127 const auto& exp
= data
.expiration
;
131 out
<< exp
.to_real_time() << "}";
136 static void generate_test_instances(std::list
<locker_info_t
*>& o
);
138 WRITE_CLASS_ENCODER_FEATURES(locker_info_t
)
141 std::map
<locker_id_t
, locker_info_t
> lockers
; // map of lockers
142 ClsLockType lock_type
; // lock type (exclusive / shared)
143 std::string tag
; // tag: operations on lock can only succeed with this tag
144 // as long as set of non expired lockers
147 void encode(ceph::buffer::list
&bl
, uint64_t features
) const {
148 ENCODE_START(1, 1, bl
);
149 encode(lockers
, bl
, features
);
150 uint8_t t
= (uint8_t)lock_type
;
155 void decode(ceph::buffer::list::const_iterator
&bl
) {
156 DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, bl
);
160 lock_type
= (ClsLockType
)t
;
165 lock_info_t() : lock_type(ClsLockType::NONE
) {}
166 void dump(ceph::Formatter
*f
) const;
167 static void generate_test_instances(std::list
<lock_info_t
*>& o
);
169 WRITE_CLASS_ENCODER_FEATURES(lock_info_t
);