]> git.proxmox.com Git - ceph.git/blame - ceph/src/mds/SnapServer.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / mds / SnapServer.h
CommitLineData
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
21class MDSRank;
22class MonClient;
23
24class SnapServer : public MDSTableServer {
25protected:
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
94public:
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};
146WRITE_CLASS_ENCODER(SnapServer)
147
148#endif