19
19
use crate :: event:: Event ;
20
20
use crate :: handlers:: http:: ingest:: push_logs_unchecked;
21
21
use crate :: handlers:: http:: query:: Query as QueryJson ;
22
+ use crate :: localcache:: LocalCacheManager ;
22
23
use crate :: metadata:: STREAM_INFO ;
23
24
use crate :: query:: stream_schema_provider:: include_now;
24
25
use crate :: {
@@ -31,10 +32,12 @@ use arrow_flight::encode::FlightDataEncoderBuilder;
31
32
use arrow_flight:: { FlightData , Ticket } ;
32
33
use arrow_ipc:: writer:: IpcWriteOptions ;
33
34
use arrow_select:: concat:: concat_batches;
35
+ use chrono:: { DateTime , Utc } ;
34
36
use datafusion:: logical_expr:: BinaryExpr ;
35
37
use datafusion:: prelude:: Expr ;
36
38
use datafusion:: scalar:: ScalarValue ;
37
39
use futures:: { stream, TryStreamExt } ;
40
+ use serde_json:: json;
38
41
39
42
use tonic:: { Request , Response , Status } ;
40
43
@@ -158,3 +161,58 @@ pub fn into_flight_data(records: Vec<RecordBatch>) -> Result<Response<DoGetStrea
158
161
159
162
Ok ( Response :: new ( Box :: pin ( flight_data_stream) as DoGetStream ) )
160
163
}
164
+
165
+ pub async fn get_from_ingester_cache (
166
+ start : & DateTime < Utc > ,
167
+ end : & DateTime < Utc > ,
168
+ stream_name : & str ,
169
+ ticket : QueryJson ,
170
+ ) -> Option < Vec < RecordBatch > > {
171
+ LocalCacheManager :: global ( ) ?;
172
+
173
+ let time_delta = * end - * start;
174
+ let goto_ingester = time_delta. num_days ( ) < CONFIG . parseable . local_cache_time_range ;
175
+ let goto_ingester = goto_ingester
176
+ && STREAM_INFO
177
+ . read ( )
178
+ . expect ( "lock should not be poisoned" )
179
+ . get ( stream_name) ?
180
+ . cache_enabled ;
181
+
182
+ if CONFIG . parseable . mode == Mode :: Query && goto_ingester {
183
+ // send the grpc call to then ingesters, if fails continue with normal flow
184
+ let start_time = ticket. start_time ;
185
+ let end_time = ticket. end_time ;
186
+ let sql = ticket. query ;
187
+ let out_ticket = json ! ( {
188
+ "query" : sql,
189
+ "startTime" : start_time,
190
+ "endTime" : end_time
191
+ } )
192
+ . to_string ( ) ;
193
+
194
+ // todo: cleanup the namespace
195
+ let ingester_metadatas = crate :: handlers:: http:: cluster:: get_ingestor_info ( )
196
+ . await
197
+ . ok ( ) ?;
198
+ let mut result_from_ingester: Vec < RecordBatch > = vec ! [ ] ;
199
+
200
+ let mut error = false ;
201
+ for im in ingester_metadatas {
202
+ if let Ok ( mut batches) = run_do_get_rpc ( im, out_ticket. clone ( ) ) . await {
203
+ result_from_ingester. append ( & mut batches) ;
204
+ } else {
205
+ error = true ;
206
+ break ;
207
+ }
208
+ }
209
+
210
+ if error {
211
+ None
212
+ } else {
213
+ Some ( result_from_ingester)
214
+ }
215
+ } else {
216
+ None
217
+ }
218
+ }
0 commit comments