@@ -22,6 +22,7 @@ namespace gs {
22
22
#ifdef BUILD_KAFKA_WAL_WRITER_PARSER
23
23
24
24
struct WalIngester {
25
+ constexpr static size_t BUFFSIZ = 4096 ;
25
26
GraphDBSession& session_;
26
27
timestamp_t begin_;
27
28
timestamp_t end_;
@@ -31,30 +32,32 @@ struct WalIngester {
31
32
std::vector<uint8_t > states_;
32
33
33
34
void resize () {
34
- size_t n = data_.size ();
35
- std::vector<std::string> new_data (n + 4096 );
36
- std::vector<uint8_t > new_states (n + 4096 , 0 );
37
- size_t idx = (ingested_plus_one_ - begin_) % n ;
38
- for (size_t i = 0 ; i < n ; ++i) {
35
+ size_t origin_len = data_.size ();
36
+ std::vector<std::string> new_data (origin_len + BUFFSIZ );
37
+ std::vector<uint8_t > new_states (origin_len + BUFFSIZ , 0 );
38
+ size_t idx = (ingested_plus_one_ - begin_) % origin_len ;
39
+ for (size_t i = 0 ; i < origin_len ; ++i) {
39
40
new_data[i] = data_[idx];
40
41
new_states[i] = states_[idx];
41
42
if (states_[idx]) {
42
43
end_ = ingested_plus_one_ + i + 1 ;
43
44
}
44
45
++idx;
45
- idx %= n ;
46
+ idx %= origin_len ;
46
47
}
47
48
data_ = std::move (new_data);
48
49
states_ = std::move (new_states);
49
50
begin_ = ingested_plus_one_;
50
51
}
52
+
53
+ timestamp_t last_ingested () const { return ingested_plus_one_ - 1 ; }
51
54
WalIngester (GraphDBSession& session, timestamp_t cur)
52
55
: session_(session),
53
56
begin_ (cur),
54
57
end_(cur),
55
58
ingested_plus_one_(cur),
56
- data_(4096 ),
57
- states_(4096 , 0 ) {}
59
+ data_(BUFFSIZ ),
60
+ states_(BUFFSIZ , 0 ) {}
58
61
59
62
bool empty () const { return ingested_plus_one_ == end_; }
60
63
@@ -77,7 +80,8 @@ struct WalIngester {
77
80
}
78
81
79
82
void ingest () {
80
- size_t idx = (ingested_plus_one_ - begin_) % data_.size ();
83
+ size_t len = data_.size ();
84
+ size_t idx = (ingested_plus_one_ - begin_) % len;
81
85
bool flag = false ;
82
86
while (states_[idx] == 2 || states_[idx] == 1 ) {
83
87
if (states_[idx] == 1 ) {
@@ -86,7 +90,7 @@ struct WalIngester {
86
90
states_[idx] = 0 ;
87
91
++ingested_plus_one_;
88
92
++idx;
89
- idx %= data_. size () ;
93
+ idx %= len ;
90
94
flag = true ;
91
95
}
92
96
if (flag) {
@@ -187,7 +191,7 @@ bool KafkaWalIngesterApp::Query(GraphDBSession& graph, Decoder& input,
187
191
timestamp_t cur_ts = graph.db ().get_last_ingested_wal_ts () + 1 ;
188
192
gs::WalIngester ingester (graph, cur_ts);
189
193
gs::KafkaWalConsumer consumer (ingester, config, topic_name, 1 );
190
- while (graph. db (). kafka_wal_ingester_state ()) {
194
+ while (!force_stop_. load ()) {
191
195
consumer.poll ();
192
196
ingester.ingest ();
193
197
std::this_thread::sleep_for (std::chrono::milliseconds (100 ));
@@ -196,8 +200,16 @@ bool KafkaWalIngesterApp::Query(GraphDBSession& graph, Decoder& input,
196
200
consumer.poll ();
197
201
ingester.ingest ();
198
202
}
203
+ int64_t ts = ingester.last_ingested ();
204
+ ouput.put_long (ts);
205
+ return true ;
206
+ }
207
+
208
+ bool KafkaWalIngesterApp::terminal () {
209
+ force_stop_.store (true );
199
210
return true ;
200
211
}
212
+
201
213
AppWrapper KafkaWalIngesterAppFactory::CreateApp (const GraphDB& db) {
202
214
return AppWrapper (new KafkaWalIngesterApp (), NULL );
203
215
}
0 commit comments