summaryrefslogtreecommitdiffstats
path: root/src/mds/locks.h
blob: 252cf0ed524001e17af487c7003b4cd8c6128380 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#ifndef CEPH_MDS_LOCKS_H
#define CEPH_MDS_LOCKS_H

struct sm_state_t {
  int next;         // 0 if stable
  char loner;
  int replica_state;
  char can_read;
  char can_read_projected;
  char can_rdlock;
  char can_wrlock;
  char can_force_wrlock;
  char can_lease;
  char can_xlock;
  int caps;
  int loner_caps;
  int xlocker_caps;
  int replica_caps;
};

struct sm_t {
  const struct sm_state_t *states;
  int allowed_ever_auth;
  int allowed_ever_replica;
  int careful;
  int can_remote_xlock;
};

#define ANY  1 // auth or replica
#define AUTH 2 // auth only
#define XCL  3 // auth or exclusive client
//#define FW   4 // fw to auth, if replica
#define REQ  5 // req state change from auth, if replica

extern const struct sm_t sm_simplelock;
extern const struct sm_t sm_filelock;
extern const struct sm_t sm_scatterlock;
extern const struct sm_t sm_locallock;



// -- lock states --
// sync <-> lock
enum {
  LOCK_UNDEF = 0,

  //                                    auth               rep
  LOCK_SYNC,    // AR   R . RD L . / C .   R RD L . / C . 
  LOCK_LOCK,    // AR   R . .. . X / . .   . .. . . / . .

  LOCK_PREXLOCK,    // A    . . .. . . / . .   (lock)
  LOCK_XLOCK,       // A    . . .. . . / . .   (lock)
  LOCK_XLOCKDONE,   // A    r p rd l x / . .   (lock)  <-- by same client only!!
  LOCK_XLOCKSNAP,   // also revoke Fb
  LOCK_LOCK_XLOCK,

  LOCK_SYNC_LOCK,    // AR   R . .. . . / . .   R .. . . / . .
  LOCK_LOCK_SYNC,    // A    R p rd l . / . .   (lock)  <-- lc by same client only

  LOCK_EXCL,         // A    . . .. . . / c x * (lock)
  LOCK_EXCL_SYNC,    // A    . . .. . . / c . * (lock)
  LOCK_EXCL_LOCK,    // A    . . .. . . / . .   (lock)
  LOCK_SYNC_EXCL,    // Ar   R . .. . . / c . * (sync->lock)
  LOCK_LOCK_EXCL,    // A    R . .. . . / . .   (lock)

  LOCK_REMOTEXLOCK,  // on NON-auth

  // * = loner mode

  LOCK_MIX,
  LOCK_SYNC_MIX,
  LOCK_SYNC_MIX2,
  LOCK_LOCK_MIX,
  LOCK_EXCL_MIX,
  LOCK_MIX_SYNC,
  LOCK_MIX_SYNC2,
  LOCK_MIX_LOCK,
  LOCK_MIX_LOCK2,
  LOCK_MIX_EXCL,

  LOCK_TSYN,
  LOCK_TSYN_LOCK,
  LOCK_TSYN_MIX,
  LOCK_LOCK_TSYN,
  LOCK_MIX_TSYN,

  LOCK_PRE_SCAN,
  LOCK_SCAN,

  LOCK_SNAP_SYNC,

  LOCK_XSYN,
  LOCK_XSYN_EXCL,
  LOCK_EXCL_XSYN,
  LOCK_XSYN_SYNC,
  LOCK_XSYN_LOCK,
  LOCK_XSYN_MIX,

  LOCK_MAX,
};

// -------------------------
// lock actions

// for replicas
#define LOCK_AC_SYNC        -1
#define LOCK_AC_MIX         -2
#define LOCK_AC_LOCK        -3
#define LOCK_AC_LOCKFLUSHED -4

// for auth
#define LOCK_AC_SYNCACK      1
#define LOCK_AC_MIXACK     2
#define LOCK_AC_LOCKACK      3

#define LOCK_AC_REQSCATTER   7
#define LOCK_AC_REQUNSCATTER 8
#define LOCK_AC_NUDGE        9
#define LOCK_AC_REQRDLOCK   10

#define LOCK_AC_FOR_REPLICA(a)  ((a) < 0)
#define LOCK_AC_FOR_AUTH(a)     ((a) > 0)


static inline const char *get_lock_action_name(int a) {
  switch (a) {
  case LOCK_AC_SYNC: return "sync";
  case LOCK_AC_MIX: return "mix";
  case LOCK_AC_LOCK: return "lock";
  case LOCK_AC_LOCKFLUSHED: return "lockflushed";

  case LOCK_AC_SYNCACK: return "syncack";
  case LOCK_AC_MIXACK: return "mixack";
  case LOCK_AC_LOCKACK: return "lockack";

  case LOCK_AC_REQSCATTER: return "reqscatter";
  case LOCK_AC_REQUNSCATTER: return "requnscatter";
  case LOCK_AC_NUDGE: return "nudge";
  case LOCK_AC_REQRDLOCK: return "reqrdlock";
  default: return "???";
  }
}



#endif