]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/client/TestClient.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) 2021 Red Hat
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 #include "gtest/gtest.h"
17 #include "common/async/context_pool.h"
18 #include "global/global_context.h"
20 #include "msg/Messenger.h"
21 #include "mon/MonClient.h"
22 #include "osdc/ObjectCacher.h"
23 #include "client/MetaRequest.h"
24 #include "client/Client.h"
25 #include "messages/MClientReclaim.h"
26 #include "messages/MClientSession.h"
27 #include "common/async/blocked_completion.h"
29 #define dout_subsys ceph_subsys_client
31 namespace bs
= boost::system
;
32 namespace ca
= ceph::async
;
34 class ClientScaffold
: public Client
{
36 ClientScaffold(Messenger
*m
, MonClient
*mc
, Objecter
*objecter_
) : Client(m
, mc
, objecter_
) {}
37 virtual ~ClientScaffold()
39 int check_dummy_op(const UserPerm
& perms
){
40 RWRef_t
mref_reader(mount_state
, CLIENT_MOUNTING
);
41 if (!mref_reader
.is_state_satisfied()) {
42 return -CEPHFS_ENOTCONN
;
44 std::scoped_lock
l(client_lock
);
45 MetaRequest
*req
= new MetaRequest(CEPH_MDS_OP_DUMMY
);
46 int res
= make_request(req
, perms
);
47 ldout(cct
, 10) << __func__
<< " result=" << res
<< dendl
;
50 int send_unknown_session_op(int op
) {
51 RWRef_t
mref_reader(mount_state
, CLIENT_MOUNTING
);
52 if (!mref_reader
.is_state_satisfied()) {
53 return -CEPHFS_ENOTCONN
;
55 std::scoped_lock
l(client_lock
);
56 auto session
= _get_or_open_mds_session(0);
57 auto msg
= make_message
<MClientSession
>(op
, session
->seq
);
58 int res
= session
->con
->send_message2(std::move(msg
));
59 ldout(cct
, 10) << __func__
<< " result=" << res
<< dendl
;
62 bool check_client_blocklisted() {
63 RWRef_t
mref_reader(mount_state
, CLIENT_MOUNTING
);
64 if (!mref_reader
.is_state_satisfied()) {
65 return -CEPHFS_ENOTCONN
;
67 std::scoped_lock
l(client_lock
);
69 ldout(cct
, 20) << __func__
<< ": waiting for latest osdmap" << dendl
;
70 objecter
->wait_for_latest_osdmap(ca::use_blocked
[ec
]);
71 ldout(cct
, 20) << __func__
<< ": got latest osdmap: " << ec
<< dendl
;
72 const auto myaddrs
= messenger
->get_myaddrs();
73 return objecter
->with_osdmap([&](const OSDMap
& o
) {return o
.is_blocklisted(myaddrs
);});
75 bool check_unknown_reclaim_flag(uint32_t flag
) {
76 RWRef_t
mref_reader(mount_state
, CLIENT_MOUNTING
);
77 if (!mref_reader
.is_state_satisfied()) {
78 return -CEPHFS_ENOTCONN
;
80 std::scoped_lock
l(client_lock
);
82 sprintf(uuid
, "unknownreclaimflag:%x", getpid());
83 auto session
= _get_or_open_mds_session(0);
84 auto m
= make_message
<MClientReclaim
>(uuid
, flag
);
85 ceph_assert(session
->con
->send_message2(std::move(m
)) == 0);
86 wait_on_list(waiting_for_reclaim
);
87 return session
->reclaim_state
== MetaSession::RECLAIM_FAIL
? true : false;
91 class TestClient
: public ::testing::Test
{
93 static void SetUpTestSuite() {
94 icp
.start(g_ceph_context
->_conf
.get_val
<std::uint64_t>("client_asio_thread_count"));
96 static void TearDownTestSuite() {
99 void SetUp() override
{
100 messenger
= Messenger::create_client_messenger(g_ceph_context
, "client");
101 if (messenger
->start() != 0) {
102 throw std::runtime_error("failed to start messenger");
105 mc
= new MonClient(g_ceph_context
, icp
);
106 if (mc
->build_initial_monmap() < 0) {
107 throw std::runtime_error("build monmap");
109 mc
->set_messenger(messenger
);
110 mc
->set_want_keys(CEPH_ENTITY_TYPE_MDS
| CEPH_ENTITY_TYPE_OSD
);
111 if (mc
->init() < 0) {
112 throw std::runtime_error("init monclient");
115 objecter
= new Objecter(g_ceph_context
, messenger
, mc
, icp
);
116 objecter
->set_client_incarnation(0);
118 messenger
->add_dispatcher_tail(objecter
);
121 client
= new ClientScaffold(messenger
, mc
, objecter
);
123 client
->mount("/", myperm
, true);
125 void TearDown() override
{
126 if (client
->is_mounted())
129 objecter
->shutdown();
131 messenger
->shutdown();
144 static inline ceph::async::io_context_pool icp
;
145 static inline UserPerm myperm
{0,0};
146 MonClient
* mc
= nullptr;
147 Messenger
* messenger
= nullptr;
148 Objecter
* objecter
= nullptr;
149 ClientScaffold
* client
= nullptr;