]>
git.proxmox.com Git - ceph.git/blob - ceph/src/messages/MMDSResolve.h
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_MMDSRESOLVE_H
16 #define CEPH_MMDSRESOLVE_H
18 #include "msg/Message.h"
20 #include "include/types.h"
22 #include "mds/Capability.h"
24 class MMDSResolve
: public SafeMessage
{
25 static const int HEAD_VERSION
= 1;
26 static const int COMPAT_VERSION
= 1;
29 map
<dirfrag_t
, vector
<dirfrag_t
> > subtrees
;
30 map
<dirfrag_t
, vector
<dirfrag_t
> > ambiguous_imports
;
32 class slave_inode_cap
{
35 map
<client_t
,Capability::Export
> cap_exports
;
37 slave_inode_cap(inodeno_t a
, map
<client_t
, Capability::Export
> b
) : ino(a
), cap_exports(b
) {}
38 void encode(bufferlist
&bl
) const
40 ENCODE_START(1, 1, bl
);
42 encode(cap_exports
, bl
);
45 void decode(bufferlist::const_iterator
&blp
)
49 decode(cap_exports
, blp
);
53 WRITE_CLASS_ENCODER(slave_inode_cap
)
55 struct slave_request
{
56 bufferlist inode_caps
;
58 slave_request() : committing(false) {}
59 void encode(bufferlist
&bl
) const {
60 ENCODE_START(1, 1, bl
);
61 encode(inode_caps
, bl
);
62 encode(committing
, bl
);
65 void decode(bufferlist::const_iterator
&blp
) {
67 decode(inode_caps
, blp
);
68 decode(committing
, blp
);
73 map
<metareqid_t
, slave_request
> slave_requests
;
75 // table client information
78 set
<version_t
> pending_commits
;
80 table_client() : type(0) {}
81 table_client(int _type
, const set
<version_t
>& commits
)
82 : type(_type
), pending_commits(commits
) {}
84 void encode(bufferlist
& bl
) const {
87 encode(pending_commits
, bl
);
89 void decode(bufferlist::const_iterator
& bl
) {
92 decode(pending_commits
, bl
);
96 list
<table_client
> table_clients
;
99 MMDSResolve() : SafeMessage
{MSG_MDS_RESOLVE
, HEAD_VERSION
, COMPAT_VERSION
}
101 ~MMDSResolve() override
{}
104 std::string_view
get_type_name() const override
{ return "mds_resolve"; }
106 void print(ostream
& out
) const override
{
107 out
<< "mds_resolve(" << subtrees
.size()
108 << "+" << ambiguous_imports
.size()
109 << " subtrees +" << slave_requests
.size() << " slave requests)";
112 void add_subtree(dirfrag_t im
) {
113 subtrees
[im
].clear();
115 void add_subtree_bound(dirfrag_t im
, dirfrag_t ex
) {
116 subtrees
[im
].push_back(ex
);
119 void add_ambiguous_import(dirfrag_t im
, const vector
<dirfrag_t
>& m
) {
120 ambiguous_imports
[im
] = m
;
123 void add_slave_request(metareqid_t reqid
, bool committing
) {
124 slave_requests
[reqid
].committing
= committing
;
127 void add_slave_request(metareqid_t reqid
, bufferlist
& bl
) {
128 slave_requests
[reqid
].inode_caps
.claim(bl
);
131 void add_table_commits(int table
, const set
<version_t
>& pending_commits
) {
132 table_clients
.push_back(table_client(table
, pending_commits
));
135 void encode_payload(uint64_t features
) override
{
137 encode(subtrees
, payload
);
138 encode(ambiguous_imports
, payload
);
139 encode(slave_requests
, payload
);
140 encode(table_clients
, payload
);
142 void decode_payload() override
{
144 auto p
= payload
.cbegin();
146 decode(ambiguous_imports
, p
);
147 decode(slave_requests
, p
);
148 decode(table_clients
, p
);
151 template<class T
, typename
... Args
>
152 friend boost::intrusive_ptr
<T
> ceph::make_message(Args
&&... args
);
155 inline ostream
& operator<<(ostream
& out
, const MMDSResolve::slave_request
&) {
159 WRITE_CLASS_ENCODER(MMDSResolve::slave_request
)
160 WRITE_CLASS_ENCODER(MMDSResolve::table_client
)
161 WRITE_CLASS_ENCODER(MMDSResolve::slave_inode_cap
)