14
14
15
15
#pragma once
16
16
17
- #include < google/protobuf/message.h>
18
- #include < grpcpp/generic/generic_stub.h>
19
- #include < grpcpp/grpcpp.h>
20
-
17
+ #include < functional>
21
18
#include < memory>
22
19
23
- #include " source/utils/circular_buffer.h"
24
-
25
- using google::protobuf::Message;
20
+ #include " google/protobuf/message.h"
21
+ #include " grpcpp/generic/generic_stub.h"
22
+ #include " grpcpp/grpcpp.h"
23
+ #include " language-agent/Tracing.pb.h"
26
24
27
25
namespace cpp2sky {
28
26
27
+ /* *
28
+ * Template base class for gRPC async client.
29
+ */
29
30
template <class RequestType , class ResponseType >
30
31
class AsyncClient {
31
32
public:
@@ -37,108 +38,78 @@ class AsyncClient {
37
38
virtual void sendMessage (RequestType message) = 0;
38
39
39
40
/* *
40
- * Pending message queue reference.
41
- */
42
- virtual CircularBuffer<RequestType>& pendingMessages () = 0;
43
-
44
- /* *
45
- * Start stream if there is no living stream.
46
- */
47
- virtual void startStream () = 0;
48
-
49
- /* *
50
- * Completion queue.
41
+ * Reset the client. This should be called when the client is no longer
42
+ * needed.
51
43
*/
52
- virtual grpc::CompletionQueue& completionQueue () = 0;
53
-
54
- /* *
55
- * gRPC Stub
56
- */
57
- virtual grpc::TemplatedGenericStub<RequestType, ResponseType>& stub () = 0;
44
+ virtual void resetClient () = 0;
58
45
};
59
46
60
47
template <class RequestType , class ResponseType >
61
48
using AsyncClientPtr = std::unique_ptr<AsyncClient<RequestType, ResponseType>>;
62
49
50
+ /* *
51
+ * Template base class for gRPC async stream. The stream is used to represent
52
+ * a single gRPC stream/request.
53
+ */
63
54
template <class RequestType , class ResponseType >
64
55
class AsyncStream {
65
56
public:
66
57
virtual ~AsyncStream () = default ;
67
58
68
59
/* *
69
- * Send message. It will move the state from Init to Write .
60
+ * Send the specified protobuf message .
70
61
*/
71
62
virtual void sendMessage (RequestType message) = 0;
72
63
};
73
64
74
- enum class StreamState : uint8_t {
75
- Initialized = 0 ,
76
- Ready = 1 ,
77
- Idle = 2 ,
78
- WriteDone = 3 ,
79
- ReadDone = 4 ,
65
+ template <class RequestType , class ResponseType >
66
+ using AsyncStreamPtr = std::unique_ptr<AsyncStream<RequestType, ResponseType>>;
67
+
68
+ /* *
69
+ * Tag for async operation. The callback should be called when the operation is
70
+ * done.
71
+ */
72
+ struct AsyncEventTag {
73
+ std::function<void (bool )> callback;
80
74
};
75
+ using AsyncEventTagPtr = std::unique_ptr<AsyncEventTag>;
76
+
77
+ using GrpcClientContextPtr = std::unique_ptr<grpc::ClientContext>;
78
+ using GrpcCompletionQueue = grpc::CompletionQueue;
81
79
82
- class AsyncStreamCallback {
80
+ /* *
81
+ * Factory for creating async stream.
82
+ */
83
+ template <class RequestType , class ResponseType >
84
+ class AsyncStreamFactory {
83
85
public:
84
- /* *
85
- * Callback when stream ready event occured.
86
- */
87
- virtual void onReady () = 0;
86
+ virtual ~AsyncStreamFactory () = default ;
88
87
89
- /* *
90
- * Callback when idle event occured.
91
- */
92
- virtual void onIdle () = 0;
88
+ using StreamPtr = AsyncStreamPtr<RequestType, ResponseType>;
89
+ using GrpcStub = grpc::TemplatedGenericStub<RequestType, ResponseType>;
93
90
94
- /* *
95
- * Callback when write done event occured.
96
- */
97
- virtual void onWriteDone () = 0;
91
+ virtual StreamPtr createStream (GrpcClientContextPtr client_ctx,
92
+ GrpcStub& stub, GrpcCompletionQueue& cq,
93
+ AsyncEventTag& basic_event_tag,
94
+ AsyncEventTag& write_event_tag) = 0;
95
+ };
98
96
99
- /* *
100
- * Callback when read done event occured.
101
- */
102
- virtual void onReadDone () = 0;
97
+ template <class RequestType , class ResponseType >
98
+ using AsyncStreamFactoryPtr =
99
+ std::unique_ptr<AsyncStreamFactory<RequestType, ResponseType>>;
103
100
104
- /* *
105
- * Callback when stream had finished with arbitrary error.
106
- */
107
- virtual void onStreamFinish () = 0;
108
- };
101
+ using TraceRequestType = skywalking::v3::SegmentObject;
102
+ using TraceResponseType = skywalking::v3::Commands;
109
103
110
- struct StreamCallbackTag {
111
- public:
112
- void callback (bool stream_finished) {
113
- if (stream_finished) {
114
- callback_->onStreamFinish ();
115
- return ;
116
- }
117
-
118
- switch (state_) {
119
- case StreamState::Ready:
120
- callback_->onReady ();
121
- break ;
122
- case StreamState::WriteDone:
123
- callback_->onWriteDone ();
124
- break ;
125
- case StreamState::Idle:
126
- callback_->onIdle ();
127
- break ;
128
- case StreamState::ReadDone:
129
- callback_->onReadDone ();
130
- break ;
131
- default :
132
- break ;
133
- }
134
- }
135
-
136
- StreamState state_;
137
- AsyncStreamCallback* callback_;
138
- };
104
+ using TraceAsyncStream = AsyncStream<TraceRequestType, TraceResponseType>;
105
+ using TraceAsyncStreamPtr = AsyncStreamPtr<TraceRequestType, TraceResponseType>;
139
106
140
- template <class RequestType , class ResponseType >
141
- using AsyncStreamSharedPtr =
142
- std::shared_ptr<AsyncStream<RequestType, ResponseType>>;
107
+ using TraceAsyncStreamFactory =
108
+ AsyncStreamFactory<TraceRequestType, TraceResponseType>;
109
+ using TraceAsyncStreamFactoryPtr =
110
+ AsyncStreamFactoryPtr<TraceRequestType, TraceResponseType>;
111
+
112
+ using TraceAsyncClient = AsyncClient<TraceRequestType, TraceResponseType>;
113
+ using TraceAsyncClientPtr = std::unique_ptr<TraceAsyncClient>;
143
114
144
115
} // namespace cpp2sky
0 commit comments