@@ -19,16 +19,12 @@ use {
19
19
} ,
20
20
} ,
21
21
solana_measure:: measure,
22
- solana_rpc:: {
23
- transaction_notifier_interface:: TransactionNotifierLock ,
24
- transaction_status_service:: TransactionStatusService ,
25
- } ,
22
+ solana_rpc:: transaction_status_service:: TransactionStatusService ,
26
23
solana_runtime:: {
27
24
accounts_background_service:: {
28
25
AbsRequestHandlers , AbsRequestSender , AccountsBackgroundService ,
29
26
PrunedBanksRequestHandler , SnapshotRequestHandler ,
30
27
} ,
31
- accounts_update_notifier_interface:: AccountsUpdateNotifier ,
32
28
bank_forks:: BankForks ,
33
29
hardened_unpack:: open_genesis_config,
34
30
snapshot_config:: SnapshotConfig ,
@@ -207,9 +203,8 @@ pub fn load_and_process_ledger(
207
203
exit ( 1 ) ;
208
204
}
209
205
210
- let mut accounts_update_notifier = Option :: < AccountsUpdateNotifier > :: default ( ) ;
211
- let mut transaction_notifier = Option :: < TransactionNotifierLock > :: default ( ) ;
212
- if arg_matches. is_present ( "geyser_plugin_config" ) {
206
+ let geyser_plugin_active = arg_matches. is_present ( "geyser_plugin_config" ) ;
207
+ let ( accounts_update_notifier, transaction_notifier) = if geyser_plugin_active {
213
208
let geyser_config_files = values_t_or_exit ! ( arg_matches, "geyser_plugin_config" , String )
214
209
. into_iter ( )
215
210
. map ( PathBuf :: from)
@@ -224,9 +219,13 @@ pub fn load_and_process_ledger(
224
219
exit ( 1 ) ;
225
220
} ,
226
221
) ;
227
- accounts_update_notifier = geyser_service. get_accounts_update_notifier ( ) ;
228
- transaction_notifier = geyser_service. get_transaction_notifier ( ) ;
229
- }
222
+ (
223
+ geyser_service. get_accounts_update_notifier ( ) ,
224
+ geyser_service. get_transaction_notifier ( ) ,
225
+ )
226
+ } else {
227
+ ( None , None )
228
+ } ;
230
229
231
230
let exit = Arc :: new ( AtomicBool :: new ( false ) ) ;
232
231
let ( bank_forks, leader_schedule_cache, starting_snapshot_hashes, ..) =
@@ -294,27 +293,41 @@ pub fn load_and_process_ledger(
294
293
None ,
295
294
) ;
296
295
297
- let ( transaction_status_sender, transaction_status_service) = if transaction_notifier. is_some ( )
298
- {
299
- let ( transaction_status_sender, transaction_status_receiver) = unbounded ( ) ;
300
- let transaction_status_service = TransactionStatusService :: new (
301
- transaction_status_receiver,
302
- Arc :: default ( ) ,
303
- false ,
304
- transaction_notifier,
305
- blockstore. clone ( ) ,
306
- false ,
307
- exit. clone ( ) ,
308
- ) ;
309
- (
310
- Some ( TransactionStatusSender {
311
- sender : transaction_status_sender,
312
- } ) ,
313
- Some ( transaction_status_service) ,
314
- )
315
- } else {
316
- ( None , None )
317
- } ;
296
+ let enable_rpc_transaction_history = arg_matches. is_present ( "enable_rpc_transaction_history" ) ;
297
+
298
+ let ( transaction_status_sender, transaction_status_service) =
299
+ if geyser_plugin_active || enable_rpc_transaction_history {
300
+ // Need Primary (R/W) access to insert transaction data
301
+ let tss_blockstore = if enable_rpc_transaction_history {
302
+ Arc :: new ( open_blockstore (
303
+ blockstore. ledger_path ( ) ,
304
+ AccessType :: PrimaryForMaintenance ,
305
+ None ,
306
+ false ,
307
+ ) )
308
+ } else {
309
+ blockstore. clone ( )
310
+ } ;
311
+
312
+ let ( transaction_status_sender, transaction_status_receiver) = unbounded ( ) ;
313
+ let transaction_status_service = TransactionStatusService :: new (
314
+ transaction_status_receiver,
315
+ Arc :: default ( ) ,
316
+ enable_rpc_transaction_history,
317
+ transaction_notifier,
318
+ tss_blockstore,
319
+ false ,
320
+ exit. clone ( ) ,
321
+ ) ;
322
+ (
323
+ Some ( TransactionStatusSender {
324
+ sender : transaction_status_sender,
325
+ } ) ,
326
+ Some ( transaction_status_service) ,
327
+ )
328
+ } else {
329
+ ( None , None )
330
+ } ;
318
331
319
332
let result = blockstore_processor:: process_blockstore_from_root (
320
333
blockstore. as_ref ( ) ,
0 commit comments