]> git.proxmox.com Git - ceph.git/blame - ceph/src/mds/SnapServer.h
import ceph 15.2.14
[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
9f95a23c
TL
21#include "messages/MRemoveSnaps.h"
22
7c673cae
FG
23class MDSRank;
24class MonClient;
25
26class SnapServer : public MDSTableServer {
9f95a23c
TL
27public:
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) {
ec96510d 57 if (ino == CEPH_INO_ROOT)
9f95a23c
TL
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
82protected:
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};
151WRITE_CLASS_ENCODER(SnapServer)
152
153#endif