]> git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/net/SocketMessenger.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / crimson / net / SocketMessenger.h
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) 2017 Red Hat, Inc
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 #pragma once
16
17 #include <map>
18 #include <set>
19 #include <vector>
20 #include <seastar/core/gate.hh>
21 #include <seastar/core/reactor.hh>
22 #include <seastar/core/sharded.hh>
23 #include <seastar/core/shared_future.hh>
24
25 #include "crimson/net/chained_dispatchers.h"
26 #include "Messenger.h"
27 #include "SocketConnection.h"
28
29 namespace crimson::net {
30
31 class FixedCPUServerSocket;
32
33 class SocketMessenger final : public Messenger {
34 const seastar::shard_id master_sid;
35 seastar::promise<> shutdown_promise;
36
37 FixedCPUServerSocket* listener = nullptr;
38 ChainedDispatchers dispatchers;
39 std::map<entity_addr_t, SocketConnectionRef> connections;
40 std::set<SocketConnectionRef> accepting_conns;
41 std::vector<SocketConnectionRef> closing_conns;
42 ceph::net::PolicySet<Throttle> policy_set;
43 // Distinguish messengers with meaningful names for debugging
44 const std::string logic_name;
45 const uint32_t nonce;
46 // specifying we haven't learned our addr; set false when we find it.
47 bool need_addr = true;
48 uint32_t global_seq = 0;
49 bool started = false;
50
51 bind_ertr::future<> do_bind(const entity_addrvec_t& addr);
52
53 public:
54 SocketMessenger(const entity_name_t& myname,
55 const std::string& logic_name,
56 uint32_t nonce);
57 ~SocketMessenger() override { ceph_assert(!listener); }
58
59 seastar::future<> set_myaddrs(const entity_addrvec_t& addr) override;
60
61 // Messenger interfaces are assumed to be called from its own shard, but its
62 // behavior should be symmetric when called from any shard.
63 bind_ertr::future<> bind(const entity_addrvec_t& addr) override;
64
65 bind_ertr::future<> try_bind(const entity_addrvec_t& addr,
66 uint32_t min_port, uint32_t max_port) override;
67
68 seastar::future<> start(const dispatchers_t& dispatchers) override;
69
70 ConnectionRef connect(const entity_addr_t& peer_addr,
71 const entity_name_t& peer_name) override;
72 // can only wait once
73 seastar::future<> wait() override {
74 assert(seastar::this_shard_id() == master_sid);
75 return shutdown_promise.get_future();
76 }
77
78 void stop() override {
79 dispatchers.clear();
80 }
81
82 bool is_started() const override {
83 return !dispatchers.empty();
84 }
85
86 seastar::future<> shutdown() override;
87
88 void print(ostream& out) const override {
89 out << get_myname()
90 << "(" << logic_name
91 << ") " << get_myaddr();
92 }
93
94 SocketPolicy get_policy(entity_type_t peer_type) const override;
95
96 SocketPolicy get_default_policy() const override;
97
98 void set_default_policy(const SocketPolicy& p) override;
99
100 void set_policy(entity_type_t peer_type, const SocketPolicy& p) override;
101
102 void set_policy_throttler(entity_type_t peer_type, Throttle* throttle) override;
103
104 public:
105 seastar::future<uint32_t> get_global_seq(uint32_t old=0);
106 seastar::future<> learned_addr(const entity_addr_t &peer_addr_for_me,
107 const SocketConnection& conn);
108
109 SocketConnectionRef lookup_conn(const entity_addr_t& addr);
110 void accept_conn(SocketConnectionRef);
111 void unaccept_conn(SocketConnectionRef);
112 void register_conn(SocketConnectionRef);
113 void unregister_conn(SocketConnectionRef);
114 void closing_conn(SocketConnectionRef);
115 void closed_conn(SocketConnectionRef);
116 seastar::shard_id shard_id() const {
117 assert(seastar::this_shard_id() == master_sid);
118 return master_sid;
119 }
120 };
121
122 } // namespace crimson::net