aboutsummaryrefslogtreecommitdiffstats
path: root/fnet/src/vespa/fnet/frt/supervisor.h
blob: 0261c7863b92f5aae359a30e2ea9f17620709e25 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#pragma once

#include "invokable.h"
#include "packets.h"
#include "reflection.h"
#include <vespa/fnet/iserveradapter.h>
#include <vespa/fnet/ipackethandler.h>
#include <vespa/fnet/connection.h>
#include <vespa/fnet/simplepacketstreamer.h>

namespace fnet { class TransportConfig; }
class FNET_Transport;
class FRT_Target;
class FNET_Scheduler;
class FRT_RPCInvoker;
class FRT_IRequestWait;

namespace vespalib { struct CryptoEngine; }


class FRT_Supervisor : public FNET_IServerAdapter,
                       public FNET_IPacketHandler
{
public:
    class RPCHooks : public FRT_Invokable
    {
    private:
        FRT_ReflectionManager *_reflectionManager;
    public:
        RPCHooks(const RPCHooks &) = delete;
        RPCHooks &operator=(const RPCHooks &) = delete;
        explicit RPCHooks(FRT_ReflectionManager *reflect)
            : _reflectionManager(reflect) {}

        void InitRPC(FRT_Supervisor *supervisor);
        void RPC_Ping(FRT_RPCRequest *req);
        void RPC_Echo(FRT_RPCRequest *req);
        void RPC_GetMethodList(FRT_RPCRequest *req);
        void RPC_GetMethodInfo(FRT_RPCRequest *req);
    };

private:
    FNET_Transport               *_transport;
    FNET_Connector               *_connector;
    FRT_ReflectionManager         _reflectionManager;
    RPCHooks                      _rpcHooks;

    static FNET_IPacketStreamer *get_packet_streamer();

public:
    explicit FRT_Supervisor(FNET_Transport *transport);
    FRT_Supervisor(const FRT_Supervisor &) = delete;
    FRT_Supervisor &operator=(const FRT_Supervisor &) = delete;
    ~FRT_Supervisor() override;

    FNET_Transport *GetTransport() { return _transport; }
    FNET_Scheduler *GetScheduler();
    FRT_ReflectionManager *GetReflectionManager() { return &_reflectionManager; }

    bool Listen(const char *spec);
    bool Listen(int port);
    uint32_t GetListenPort() const;

    FRT_Target *GetTarget(const char *spec);
    FRT_Target *Get2WayTarget(const char *spec, FNET_Context connContext = FNET_Context());
    FRT_Target *GetTarget(int port);
    static FRT_RPCRequest *AllocRPCRequest(FRT_RPCRequest *tradein = nullptr);

    struct SchedulerPtr {
        FNET_Scheduler *ptr;
        SchedulerPtr(FNET_Scheduler *scheduler)
            : ptr(scheduler) {}
        SchedulerPtr(FNET_Transport *transport);
        SchedulerPtr(FNET_TransportThread *transport_thread);
    };

    // methods for performing rpc invocations
    static void InvokeVoid(FNET_Connection *conn, FRT_RPCRequest *req);
    static void InvokeSync(SchedulerPtr scheduler, FNET_Connection *conn, FRT_RPCRequest *req, double timeout);
    static void InvokeAsync(SchedulerPtr scheduler, FNET_Connection *conn, FRT_RPCRequest *req, double timeout, FRT_IRequestWait *waiter);


    // FNET ServerAdapter Interface
    bool InitChannel(FNET_Channel *channel, uint32_t pcode) override;

    // Packet Handling
    HP_RetCode HandlePacket(FNET_Packet *packet, FNET_Context context) override;
};

namespace fnet::frt {

/**
 * This is a simple class that makes it easy to test RPC.
 * Normally you do not want use it in production code as it hides your possibilites and responsibilities.
 */
class StandaloneFRT {
public:
    explicit StandaloneFRT(const TransportConfig &config);
    StandaloneFRT();
    explicit StandaloneFRT(std::shared_ptr<vespalib::CryptoEngine> crypto);
    ~StandaloneFRT();
    FRT_Supervisor &supervisor() { return *_supervisor; }
    const FRT_Supervisor &supervisor() const { return *_supervisor; }
    void shutdown();
private:
    std::unique_ptr<FNET_Transport> _transport;
    std::unique_ptr<FRT_Supervisor> _supervisor;
};

}