@@ -90,6 +90,8 @@ struct EventObserver {
90
90
endpoint : String ,
91
91
/// Timeout for sending events to this observer
92
92
timeout : Duration ,
93
+ /// Lossy observers do not retry on error
94
+ lossy : bool ,
93
95
}
94
96
95
97
struct ReceiptPayloadInfo < ' a > {
@@ -439,7 +441,7 @@ impl EventObserver {
439
441
440
442
for ( id, url, payload, timeout_ms) in pending_payloads {
441
443
let timeout = Duration :: from_millis ( timeout_ms) ;
442
- Self :: send_payload_directly ( & payload, & url, timeout) ;
444
+ Self :: send_payload_directly ( & payload, & url, timeout, false ) ;
443
445
444
446
#[ cfg( test) ]
445
447
if TEST_EVENT_OBSERVER_SKIP_RETRY . get ( ) {
@@ -456,7 +458,12 @@ impl EventObserver {
456
458
}
457
459
}
458
460
459
- fn send_payload_directly ( payload : & serde_json:: Value , full_url : & str , timeout : Duration ) {
461
+ fn send_payload_directly (
462
+ payload : & serde_json:: Value ,
463
+ full_url : & str ,
464
+ timeout : Duration ,
465
+ lossy : bool ,
466
+ ) {
460
467
debug ! (
461
468
"Event dispatcher: Sending payload" ; "url" => %full_url, "payload" => ?payload
462
469
) ;
@@ -506,6 +513,11 @@ impl EventObserver {
506
513
}
507
514
}
508
515
516
+ if lossy {
517
+ warn ! ( "Observer is configured in lossy mode: skipping retry of payload" ) ;
518
+ return ;
519
+ }
520
+
509
521
#[ cfg( test) ]
510
522
if TEST_EVENT_OBSERVER_SKIP_RETRY . get ( ) {
511
523
warn ! ( "Fault injection: skipping retry of payload" ) ;
@@ -522,7 +534,7 @@ impl EventObserver {
522
534
}
523
535
}
524
536
525
- fn new ( working_dir : Option < PathBuf > , endpoint : String , timeout : Duration ) -> Self {
537
+ fn new ( working_dir : Option < PathBuf > , endpoint : String , timeout : Duration , lossy : bool ) -> Self {
526
538
let db_path = if let Some ( mut db_path) = working_dir {
527
539
db_path. push ( "event_observers.sqlite" ) ;
528
540
@@ -541,6 +553,7 @@ impl EventObserver {
541
553
db_path,
542
554
endpoint,
543
555
timeout,
556
+ lossy,
544
557
}
545
558
}
546
559
@@ -555,18 +568,23 @@ impl EventObserver {
555
568
} ;
556
569
let full_url = format ! ( "http://{url_str}" ) ;
557
570
558
- if let Some ( db_path) = & self . db_path {
559
- let conn =
560
- Connection :: open ( db_path) . expect ( "Failed to open database for event observer" ) ;
571
+ // if the observer is in lossy mode quickly send the payload without checking for the db
572
+ if self . lossy {
573
+ Self :: send_payload_directly ( payload, & full_url, self . timeout , true ) ;
574
+ } else {
575
+ if let Some ( db_path) = & self . db_path {
576
+ let conn =
577
+ Connection :: open ( db_path) . expect ( "Failed to open database for event observer" ) ;
561
578
562
- // Insert the new payload into the database
563
- Self :: insert_payload_with_retry ( & conn, & full_url, payload, self . timeout ) ;
579
+ // Insert the new payload into the database
580
+ Self :: insert_payload_with_retry ( & conn, & full_url, payload, self . timeout ) ;
564
581
565
- // Process all pending payloads
566
- Self :: process_pending_payloads ( & conn) ;
567
- } else {
568
- // No database, just send the payload
569
- Self :: send_payload_directly ( payload, & full_url, self . timeout ) ;
582
+ // Process all pending payloads
583
+ Self :: process_pending_payloads ( & conn) ;
584
+ } else {
585
+ // No database, just send the payload
586
+ Self :: send_payload_directly ( payload, & full_url, self . timeout , false ) ;
587
+ }
570
588
}
571
589
}
572
590
@@ -1666,6 +1684,7 @@ impl EventDispatcher {
1666
1684
Some ( working_dir) ,
1667
1685
conf. endpoint . clone ( ) ,
1668
1686
Duration :: from_millis ( conf. timeout_ms ) ,
1687
+ conf. lossy ,
1669
1688
) ;
1670
1689
1671
1690
let observer_index = self . registered_observers . len ( ) as u16 ;
@@ -1770,7 +1789,8 @@ mod test {
1770
1789
1771
1790
#[ test]
1772
1791
fn build_block_processed_event ( ) {
1773
- let observer = EventObserver :: new ( None , "nowhere" . to_string ( ) , Duration :: from_secs ( 3 ) ) ;
1792
+ let observer =
1793
+ EventObserver :: new ( None , "nowhere" . to_string ( ) , Duration :: from_secs ( 3 ) , false ) ;
1774
1794
1775
1795
let filtered_events = vec ! [ ] ;
1776
1796
let block = StacksBlock :: genesis_block ( ) ;
@@ -1830,7 +1850,8 @@ mod test {
1830
1850
1831
1851
#[ test]
1832
1852
fn test_block_processed_event_nakamoto ( ) {
1833
- let observer = EventObserver :: new ( None , "nowhere" . to_string ( ) , Duration :: from_secs ( 3 ) ) ;
1853
+ let observer =
1854
+ EventObserver :: new ( None , "nowhere" . to_string ( ) , Duration :: from_secs ( 3 ) , false ) ;
1834
1855
1835
1856
let filtered_events = vec ! [ ] ;
1836
1857
let mut block_header = NakamotoBlockHeader :: empty ( ) ;
@@ -2087,7 +2108,8 @@ mod test {
2087
2108
let endpoint = "http://example.com" . to_string ( ) ;
2088
2109
let timeout = Duration :: from_secs ( 5 ) ;
2089
2110
2090
- let observer = EventObserver :: new ( Some ( working_dir. clone ( ) ) , endpoint. clone ( ) , timeout) ;
2111
+ let observer =
2112
+ EventObserver :: new ( Some ( working_dir. clone ( ) ) , endpoint. clone ( ) , timeout, false ) ;
2091
2113
2092
2114
// Verify fields
2093
2115
assert_eq ! ( observer. endpoint, endpoint) ;
@@ -2104,7 +2126,7 @@ mod test {
2104
2126
let endpoint = "http://example.com" . to_string ( ) ;
2105
2127
let timeout = Duration :: from_secs ( 5 ) ;
2106
2128
2107
- let observer = EventObserver :: new ( None , endpoint. clone ( ) , timeout) ;
2129
+ let observer = EventObserver :: new ( None , endpoint. clone ( ) , timeout, false ) ;
2108
2130
2109
2131
// Verify fields
2110
2132
assert_eq ! ( observer. endpoint, endpoint) ;
@@ -2133,7 +2155,7 @@ mod test {
2133
2155
let endpoint = server. url ( ) . strip_prefix ( "http://" ) . unwrap ( ) . to_string ( ) ;
2134
2156
let timeout = Duration :: from_secs ( 5 ) ;
2135
2157
2136
- let observer = EventObserver :: new ( Some ( working_dir) , endpoint, timeout) ;
2158
+ let observer = EventObserver :: new ( Some ( working_dir) , endpoint, timeout, false ) ;
2137
2159
2138
2160
TEST_EVENT_OBSERVER_SKIP_RETRY . set ( false ) ;
2139
2161
@@ -2170,7 +2192,7 @@ mod test {
2170
2192
2171
2193
let endpoint = server. url ( ) . strip_prefix ( "http://" ) . unwrap ( ) . to_string ( ) ;
2172
2194
2173
- let observer = EventObserver :: new ( None , endpoint, timeout) ;
2195
+ let observer = EventObserver :: new ( None , endpoint, timeout, false ) ;
2174
2196
2175
2197
// Call send_payload
2176
2198
observer. send_payload ( & payload, "/test" ) ;
@@ -2201,8 +2223,12 @@ mod test {
2201
2223
tx. send ( ( ) ) . unwrap ( ) ;
2202
2224
} ) ;
2203
2225
2204
- let observer =
2205
- EventObserver :: new ( None , format ! ( "127.0.0.1:{port}" ) , Duration :: from_secs ( 3 ) ) ;
2226
+ let observer = EventObserver :: new (
2227
+ None ,
2228
+ format ! ( "127.0.0.1:{port}" ) ,
2229
+ Duration :: from_secs ( 3 ) ,
2230
+ false ,
2231
+ ) ;
2206
2232
2207
2233
let payload = json ! ( { "key" : "value" } ) ;
2208
2234
@@ -2250,8 +2276,12 @@ mod test {
2250
2276
}
2251
2277
} ) ;
2252
2278
2253
- let observer =
2254
- EventObserver :: new ( None , format ! ( "127.0.0.1:{port}" ) , Duration :: from_secs ( 3 ) ) ;
2279
+ let observer = EventObserver :: new (
2280
+ None ,
2281
+ format ! ( "127.0.0.1:{port}" ) ,
2282
+ Duration :: from_secs ( 3 ) ,
2283
+ false ,
2284
+ ) ;
2255
2285
2256
2286
let payload = json ! ( { "key" : "value" } ) ;
2257
2287
@@ -2298,7 +2328,7 @@ mod test {
2298
2328
}
2299
2329
} ) ;
2300
2330
2301
- let observer = EventObserver :: new ( None , format ! ( "127.0.0.1:{port}" ) , timeout) ;
2331
+ let observer = EventObserver :: new ( None , format ! ( "127.0.0.1:{port}" ) , timeout, false ) ;
2302
2332
2303
2333
let payload = json ! ( { "key" : "value" } ) ;
2304
2334
@@ -2391,7 +2421,12 @@ mod test {
2391
2421
}
2392
2422
} ) ;
2393
2423
2394
- let observer = EventObserver :: new ( Some ( working_dir) , format ! ( "127.0.0.1:{port}" ) , timeout) ;
2424
+ let observer = EventObserver :: new (
2425
+ Some ( working_dir) ,
2426
+ format ! ( "127.0.0.1:{port}" ) ,
2427
+ timeout,
2428
+ false ,
2429
+ ) ;
2395
2430
2396
2431
let payload = json ! ( { "key" : "value" } ) ;
2397
2432
let payload2 = json ! ( { "key" : "value2" } ) ;
0 commit comments