]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | /* | |
4 | * Ceph - scalable distributed file system | |
5 | * | |
6 | * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net> | |
7 | * | |
8 | * This is free software; you can redistribute it and/or | |
9 | * modify it under the terms of the GNU Lesser General Public | |
10 | * License version 2.1, as published by the Free Software | |
11 | * Foundation. See file COPYING. | |
12 | * | |
13 | */ | |
14 | ||
15 | #ifndef CEPH_SNAPSERVER_H | |
16 | #define CEPH_SNAPSERVER_H | |
17 | ||
18 | #include "MDSTableServer.h" | |
19 | #include "snap.h" | |
20 | ||
21 | class MDSRank; | |
22 | class MonClient; | |
23 | ||
24 | class SnapServer : public MDSTableServer { | |
25 | protected: | |
11fdf7f2 TL |
26 | MonClient *mon_client = nullptr; |
27 | snapid_t last_snap = 0; | |
28 | snapid_t last_created, last_destroyed; | |
29 | snapid_t snaprealm_v2_since; | |
7c673cae FG |
30 | map<snapid_t, SnapInfo> snaps; |
31 | map<int, set<snapid_t> > need_to_purge; | |
32 | ||
33 | map<version_t, SnapInfo> pending_update; | |
34 | map<version_t, pair<snapid_t,snapid_t> > pending_destroy; // (removed_snap, seq) | |
35 | set<version_t> pending_noop; | |
36 | ||
37 | version_t last_checked_osdmap; | |
38 | ||
11fdf7f2 TL |
39 | bool root_scrubbed = false; // all snaprealms under root are converted? |
40 | bool mdsdir_scrubbed = false; // all snaprealms under ~mds0 are converted? | |
41 | ||
7c673cae | 42 | void encode_server_state(bufferlist& bl) const override { |
11fdf7f2 TL |
43 | ENCODE_START(5, 3, bl); |
44 | encode(last_snap, bl); | |
45 | encode(snaps, bl); | |
46 | encode(need_to_purge, bl); | |
47 | encode(pending_update, bl); | |
48 | encode(pending_destroy, bl); | |
49 | encode(pending_noop, bl); | |
50 | encode(last_created, bl); | |
51 | encode(last_destroyed, bl); | |
52 | encode(snaprealm_v2_since, bl); | |
7c673cae FG |
53 | ENCODE_FINISH(bl); |
54 | } | |
11fdf7f2 TL |
55 | void decode_server_state(bufferlist::const_iterator& bl) override { |
56 | DECODE_START_LEGACY_COMPAT_LEN(5, 3, 3, bl); | |
57 | decode(last_snap, bl); | |
58 | decode(snaps, bl); | |
59 | decode(need_to_purge, bl); | |
60 | decode(pending_update, bl); | |
7c673cae | 61 | if (struct_v >= 2) |
11fdf7f2 | 62 | decode(pending_destroy, bl); |
7c673cae FG |
63 | else { |
64 | map<version_t, snapid_t> t; | |
11fdf7f2 | 65 | decode(t, bl); |
7c673cae FG |
66 | for (map<version_t, snapid_t>::iterator p = t.begin(); p != t.end(); ++p) |
67 | pending_destroy[p->first].first = p->second; | |
68 | } | |
11fdf7f2 TL |
69 | decode(pending_noop, bl); |
70 | if (struct_v >= 4) { | |
71 | decode(last_created, bl); | |
72 | decode(last_destroyed, bl); | |
73 | } else { | |
74 | last_created = last_snap; | |
75 | last_destroyed = last_snap; | |
76 | } | |
77 | if (struct_v >= 5) | |
78 | decode(snaprealm_v2_since, bl); | |
79 | else | |
80 | snaprealm_v2_since = CEPH_NOSNAP; | |
81 | ||
7c673cae FG |
82 | DECODE_FINISH(bl); |
83 | } | |
84 | ||
11fdf7f2 TL |
85 | // server bits |
86 | void _prepare(const bufferlist &bl, uint64_t reqid, mds_rank_t bymds, bufferlist &out) override; | |
87 | void _get_reply_buffer(version_t tid, bufferlist *pbl) const override; | |
88 | void _commit(version_t tid, MMDSTableRequest::const_ref req) override; | |
89 | void _rollback(version_t tid) override; | |
90 | void _server_update(bufferlist& bl) override; | |
91 | bool _notify_prep(version_t tid) override; | |
92 | void handle_query(const MMDSTableRequest::const_ref &m) override; | |
93 | ||
94 | public: | |
95 | SnapServer(MDSRank *m, MonClient *monc) | |
96 | : MDSTableServer(m, TABLE_SNAP), mon_client(monc), last_checked_osdmap(0) {} | |
7c673cae | 97 | SnapServer() : MDSTableServer(NULL, TABLE_SNAP), last_checked_osdmap(0) {} |
11fdf7f2 TL |
98 | |
99 | void reset_state() override; | |
100 | ||
101 | bool upgrade_format() { | |
102 | // upgraded from old filesystem | |
103 | ceph_assert(last_snap > 0); | |
104 | bool upgraded = false; | |
105 | if (get_version() == 0) { | |
106 | // version 0 confuses snapclient code | |
107 | reset_state(); | |
108 | upgraded = true; | |
109 | } | |
110 | if (snaprealm_v2_since == CEPH_NOSNAP) { | |
111 | // new snapshots will have new format snaprealms | |
112 | snaprealm_v2_since = last_snap + 1; | |
113 | upgraded = true; | |
114 | } | |
115 | return upgraded; | |
116 | } | |
117 | ||
118 | void check_osd_map(bool force); | |
119 | ||
120 | void mark_base_recursively_scrubbed(inodeno_t ino) { | |
121 | if (ino == MDS_INO_ROOT) | |
122 | root_scrubbed = true; | |
123 | else if (ino == MDS_INO_MDSDIR(rank)) | |
124 | mdsdir_scrubbed = true; | |
125 | else | |
126 | ceph_abort(); | |
127 | } | |
128 | bool can_allow_multimds_snaps() const { | |
129 | return (root_scrubbed && mdsdir_scrubbed) || | |
130 | snaps.empty() || snaps.begin()->first >= snaprealm_v2_since; | |
131 | } | |
132 | ||
7c673cae FG |
133 | void encode(bufferlist& bl) const { |
134 | encode_server_state(bl); | |
135 | } | |
11fdf7f2 | 136 | void decode(bufferlist::const_iterator& bl) { |
7c673cae FG |
137 | decode_server_state(bl); |
138 | } | |
11fdf7f2 | 139 | |
7c673cae FG |
140 | void dump(Formatter *f) const; |
141 | static void generate_test_instances(list<SnapServer*>& ls); | |
142 | ||
11fdf7f2 TL |
143 | bool force_update(snapid_t last, snapid_t v2_since, |
144 | map<snapid_t, SnapInfo>& _snaps); | |
7c673cae FG |
145 | }; |
146 | WRITE_CLASS_ENCODER(SnapServer) | |
147 | ||
148 | #endif |