]> git.proxmox.com Git - ceph.git/blame - ceph/src/mds/SnapServer.h
import ceph 16.2.6
[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
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
73protected:
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};
139WRITE_CLASS_ENCODER(SnapServer)
140
141#endif