]>
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 | ||
9f95a23c TL |
21 | #include "messages/MRemoveSnaps.h" |
22 | ||
7c673cae FG |
23 | class MDSRank; |
24 | class MonClient; | |
25 | ||
26 | class SnapServer : public MDSTableServer { | |
9f95a23c TL |
27 | public: |
28 | SnapServer(MDSRank *m, MonClient *monc) | |
29 | : MDSTableServer(m, TABLE_SNAP), mon_client(monc) {} | |
30 | SnapServer() : MDSTableServer(NULL, TABLE_SNAP) {} | |
7c673cae | 31 | |
9f95a23c | 32 | void handle_remove_snaps(const cref_t<MRemoveSnaps> &m); |
7c673cae | 33 | |
9f95a23c | 34 | void reset_state() override; |
11fdf7f2 | 35 | |
9f95a23c TL |
36 | bool upgrade_format() { |
37 | // upgraded from old filesystem | |
38 | ceph_assert(is_active()); | |
39 | ceph_assert(last_snap > 0); | |
40 | bool upgraded = false; | |
41 | if (get_version() == 0) { | |
42 | // version 0 confuses snapclient code | |
43 | reset(); | |
44 | upgraded = true; | |
45 | } | |
46 | if (snaprealm_v2_since == CEPH_NOSNAP) { | |
47 | // new snapshots will have new format snaprealms | |
48 | snaprealm_v2_since = last_snap + 1; | |
49 | upgraded = true; | |
50 | } | |
51 | return upgraded; | |
52 | } | |
53 | ||
54 | void check_osd_map(bool force); | |
55 | ||
56 | void mark_base_recursively_scrubbed(inodeno_t ino) { | |
57 | if (ino == MDS_INO_ROOT) | |
58 | root_scrubbed = true; | |
59 | else if (ino == MDS_INO_MDSDIR(rank)) | |
60 | mdsdir_scrubbed = true; | |
61 | else | |
62 | ceph_abort(); | |
63 | } | |
64 | bool can_allow_multimds_snaps() const { | |
65 | return (root_scrubbed && mdsdir_scrubbed) || | |
66 | snaps.empty() || snaps.begin()->first >= snaprealm_v2_since; | |
67 | } | |
68 | ||
69 | void encode(bufferlist& bl) const { | |
70 | encode_server_state(bl); | |
71 | } | |
72 | void decode(bufferlist::const_iterator& bl) { | |
73 | decode_server_state(bl); | |
74 | } | |
75 | ||
76 | void dump(Formatter *f) const; | |
77 | static void generate_test_instances(std::list<SnapServer*>& ls); | |
78 | ||
79 | bool force_update(snapid_t last, snapid_t v2_since, | |
80 | map<snapid_t, SnapInfo>& _snaps); | |
81 | ||
82 | protected: | |
7c673cae | 83 | void encode_server_state(bufferlist& bl) const override { |
11fdf7f2 TL |
84 | ENCODE_START(5, 3, bl); |
85 | encode(last_snap, bl); | |
86 | encode(snaps, bl); | |
87 | encode(need_to_purge, bl); | |
88 | encode(pending_update, bl); | |
89 | encode(pending_destroy, bl); | |
90 | encode(pending_noop, bl); | |
91 | encode(last_created, bl); | |
92 | encode(last_destroyed, bl); | |
93 | encode(snaprealm_v2_since, bl); | |
7c673cae FG |
94 | ENCODE_FINISH(bl); |
95 | } | |
11fdf7f2 TL |
96 | void decode_server_state(bufferlist::const_iterator& bl) override { |
97 | DECODE_START_LEGACY_COMPAT_LEN(5, 3, 3, bl); | |
98 | decode(last_snap, bl); | |
99 | decode(snaps, bl); | |
100 | decode(need_to_purge, bl); | |
101 | decode(pending_update, bl); | |
7c673cae | 102 | if (struct_v >= 2) |
11fdf7f2 | 103 | decode(pending_destroy, bl); |
7c673cae FG |
104 | else { |
105 | map<version_t, snapid_t> t; | |
11fdf7f2 | 106 | decode(t, bl); |
7c673cae FG |
107 | for (map<version_t, snapid_t>::iterator p = t.begin(); p != t.end(); ++p) |
108 | pending_destroy[p->first].first = p->second; | |
109 | } | |
11fdf7f2 TL |
110 | decode(pending_noop, bl); |
111 | if (struct_v >= 4) { | |
112 | decode(last_created, bl); | |
113 | decode(last_destroyed, bl); | |
114 | } else { | |
115 | last_created = last_snap; | |
116 | last_destroyed = last_snap; | |
117 | } | |
118 | if (struct_v >= 5) | |
119 | decode(snaprealm_v2_since, bl); | |
120 | else | |
121 | snaprealm_v2_since = CEPH_NOSNAP; | |
122 | ||
7c673cae FG |
123 | DECODE_FINISH(bl); |
124 | } | |
125 | ||
11fdf7f2 TL |
126 | // server bits |
127 | void _prepare(const bufferlist &bl, uint64_t reqid, mds_rank_t bymds, bufferlist &out) override; | |
128 | void _get_reply_buffer(version_t tid, bufferlist *pbl) const override; | |
9f95a23c | 129 | void _commit(version_t tid, cref_t<MMDSTableRequest> req) override; |
11fdf7f2 TL |
130 | void _rollback(version_t tid) override; |
131 | void _server_update(bufferlist& bl) override; | |
132 | bool _notify_prep(version_t tid) override; | |
9f95a23c | 133 | void handle_query(const cref_t<MMDSTableRequest> &m) override; |
11fdf7f2 | 134 | |
9f95a23c TL |
135 | MonClient *mon_client = nullptr; |
136 | snapid_t last_snap = 0; | |
137 | snapid_t last_created, last_destroyed; | |
138 | snapid_t snaprealm_v2_since; | |
139 | map<snapid_t, SnapInfo> snaps; | |
140 | map<int, set<snapid_t> > need_to_purge; | |
11fdf7f2 | 141 | |
9f95a23c TL |
142 | map<version_t, SnapInfo> pending_update; |
143 | map<version_t, pair<snapid_t,snapid_t> > pending_destroy; // (removed_snap, seq) | |
144 | set<version_t> pending_noop; | |
11fdf7f2 | 145 | |
9f95a23c | 146 | version_t last_checked_osdmap = 0; |
7c673cae | 147 | |
9f95a23c TL |
148 | bool root_scrubbed = false; // all snaprealms under root are converted? |
149 | bool mdsdir_scrubbed = false; // all snaprealms under ~mds0 are converted? | |
7c673cae FG |
150 | }; |
151 | WRITE_CLASS_ENCODER(SnapServer) | |
152 | ||
153 | #endif |