]>
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 | ||
9f95a23c | 56 | bool can_allow_multimds_snaps() const { |
f67539c2 | 57 | return snaps.empty() || snaps.begin()->first >= snaprealm_v2_since; |
9f95a23c TL |
58 | } |
59 | ||
60 | void encode(bufferlist& bl) const { | |
61 | encode_server_state(bl); | |
62 | } | |
63 | void decode(bufferlist::const_iterator& bl) { | |
64 | decode_server_state(bl); | |
65 | } | |
66 | ||
67 | void dump(Formatter *f) const; | |
68 | static void generate_test_instances(std::list<SnapServer*>& ls); | |
69 | ||
70 | bool force_update(snapid_t last, snapid_t v2_since, | |
71 | map<snapid_t, SnapInfo>& _snaps); | |
72 | ||
73 | protected: | |
7c673cae | 74 | void encode_server_state(bufferlist& bl) const override { |
11fdf7f2 TL |
75 | ENCODE_START(5, 3, bl); |
76 | encode(last_snap, bl); | |
77 | encode(snaps, bl); | |
78 | encode(need_to_purge, bl); | |
79 | encode(pending_update, bl); | |
80 | encode(pending_destroy, bl); | |
81 | encode(pending_noop, bl); | |
82 | encode(last_created, bl); | |
83 | encode(last_destroyed, bl); | |
84 | encode(snaprealm_v2_since, bl); | |
7c673cae FG |
85 | ENCODE_FINISH(bl); |
86 | } | |
11fdf7f2 TL |
87 | void decode_server_state(bufferlist::const_iterator& bl) override { |
88 | DECODE_START_LEGACY_COMPAT_LEN(5, 3, 3, bl); | |
89 | decode(last_snap, bl); | |
90 | decode(snaps, bl); | |
91 | decode(need_to_purge, bl); | |
92 | decode(pending_update, bl); | |
7c673cae | 93 | if (struct_v >= 2) |
11fdf7f2 | 94 | decode(pending_destroy, bl); |
7c673cae FG |
95 | else { |
96 | map<version_t, snapid_t> t; | |
11fdf7f2 | 97 | decode(t, bl); |
7c673cae FG |
98 | for (map<version_t, snapid_t>::iterator p = t.begin(); p != t.end(); ++p) |
99 | pending_destroy[p->first].first = p->second; | |
100 | } | |
11fdf7f2 TL |
101 | decode(pending_noop, bl); |
102 | if (struct_v >= 4) { | |
103 | decode(last_created, bl); | |
104 | decode(last_destroyed, bl); | |
105 | } else { | |
106 | last_created = last_snap; | |
107 | last_destroyed = last_snap; | |
108 | } | |
109 | if (struct_v >= 5) | |
110 | decode(snaprealm_v2_since, bl); | |
111 | else | |
112 | snaprealm_v2_since = CEPH_NOSNAP; | |
113 | ||
7c673cae FG |
114 | DECODE_FINISH(bl); |
115 | } | |
116 | ||
11fdf7f2 TL |
117 | // server bits |
118 | void _prepare(const bufferlist &bl, uint64_t reqid, mds_rank_t bymds, bufferlist &out) override; | |
119 | void _get_reply_buffer(version_t tid, bufferlist *pbl) const override; | |
9f95a23c | 120 | void _commit(version_t tid, cref_t<MMDSTableRequest> req) override; |
11fdf7f2 TL |
121 | void _rollback(version_t tid) override; |
122 | void _server_update(bufferlist& bl) override; | |
123 | bool _notify_prep(version_t tid) override; | |
9f95a23c | 124 | void handle_query(const cref_t<MMDSTableRequest> &m) override; |
11fdf7f2 | 125 | |
9f95a23c TL |
126 | MonClient *mon_client = nullptr; |
127 | snapid_t last_snap = 0; | |
128 | snapid_t last_created, last_destroyed; | |
129 | snapid_t snaprealm_v2_since; | |
130 | map<snapid_t, SnapInfo> snaps; | |
131 | map<int, set<snapid_t> > need_to_purge; | |
11fdf7f2 | 132 | |
9f95a23c TL |
133 | map<version_t, SnapInfo> pending_update; |
134 | map<version_t, pair<snapid_t,snapid_t> > pending_destroy; // (removed_snap, seq) | |
135 | set<version_t> pending_noop; | |
11fdf7f2 | 136 | |
9f95a23c | 137 | version_t last_checked_osdmap = 0; |
7c673cae FG |
138 | }; |
139 | WRITE_CLASS_ENCODER(SnapServer) | |
140 | ||
141 | #endif |