1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
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.
15 #ifndef CEPH_SNAPSERVER_H
16 #define CEPH_SNAPSERVER_H
18 #include "MDSTableServer.h"
21 #include "messages/MRemoveSnaps.h"
26 class SnapServer
: public MDSTableServer
{
28 SnapServer(MDSRank
*m
, MonClient
*monc
)
29 : MDSTableServer(m
, TABLE_SNAP
), mon_client(monc
) {}
30 SnapServer() : MDSTableServer(NULL
, TABLE_SNAP
) {}
32 void handle_remove_snaps(const cref_t
<MRemoveSnaps
> &m
);
34 void reset_state() override
;
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
46 if (snaprealm_v2_since
== CEPH_NOSNAP
) {
47 // new snapshots will have new format snaprealms
48 snaprealm_v2_since
= last_snap
+ 1;
54 void check_osd_map(bool force
);
56 bool can_allow_multimds_snaps() const {
57 return snaps
.empty() || snaps
.begin()->first
>= snaprealm_v2_since
;
60 void encode(bufferlist
& bl
) const {
61 encode_server_state(bl
);
63 void decode(bufferlist::const_iterator
& bl
) {
64 decode_server_state(bl
);
67 void dump(Formatter
*f
) const;
68 static void generate_test_instances(std::list
<SnapServer
*>& ls
);
70 bool force_update(snapid_t last
, snapid_t v2_since
,
71 map
<snapid_t
, SnapInfo
>& _snaps
);
74 void encode_server_state(bufferlist
& bl
) const override
{
75 ENCODE_START(5, 3, bl
);
76 encode(last_snap
, 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
);
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
);
91 decode(need_to_purge
, bl
);
92 decode(pending_update
, bl
);
94 decode(pending_destroy
, bl
);
96 map
<version_t
, snapid_t
> t
;
98 for (map
<version_t
, snapid_t
>::iterator p
= t
.begin(); p
!= t
.end(); ++p
)
99 pending_destroy
[p
->first
].first
= p
->second
;
101 decode(pending_noop
, bl
);
103 decode(last_created
, bl
);
104 decode(last_destroyed
, bl
);
106 last_created
= last_snap
;
107 last_destroyed
= last_snap
;
110 decode(snaprealm_v2_since
, bl
);
112 snaprealm_v2_since
= CEPH_NOSNAP
;
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
;
120 void _commit(version_t tid
, cref_t
<MMDSTableRequest
> req
) override
;
121 void _rollback(version_t tid
) override
;
122 void _server_update(bufferlist
& bl
) override
;
123 bool _notify_prep(version_t tid
) override
;
124 void handle_query(const cref_t
<MMDSTableRequest
> &m
) override
;
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
;
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
;
137 version_t last_checked_osdmap
= 0;
139 WRITE_CLASS_ENCODER(SnapServer
)