Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 845f0d4

Browse files
mergify[bot]t-nelson
authored andcommitted
v1.17: rpc-sts: add config options for stake-weighted qos (backport of #197) (#340)
rpc-sts: add config options for stake-weighted qos (#197) * rpc-sts: plumb options for swqos config * rpc-sts: send to specific tpu peers when configured (cherry picked from commit f41fb84) # Conflicts: # send-transaction-service/src/send_transaction_service.rs # validator/src/cli.rs # validator/src/main.rs Co-authored-by: Trent Nelson <[email protected]>
1 parent 4f3f939 commit 845f0d4

File tree

3 files changed

+57
-9
lines changed

3 files changed

+57
-9
lines changed

send-transaction-service/src/send_transaction_service.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ pub struct Config {
114114
pub batch_size: usize,
115115
/// How frequently batches are sent
116116
pub batch_send_rate_ms: u64,
117+
pub tpu_peers: Option<Vec<SocketAddr>>,
117118
}
118119

119120
impl Default for Config {
@@ -125,6 +126,7 @@ impl Default for Config {
125126
service_max_retries: DEFAULT_SERVICE_MAX_RETRIES,
126127
batch_size: DEFAULT_TRANSACTION_BATCH_SIZE,
127128
batch_send_rate_ms: DEFAULT_BATCH_SEND_RATE_MS,
129+
tpu_peers: None,
128130
}
129131
}
130132
}
@@ -565,12 +567,18 @@ impl SendTransactionService {
565567
stats: &SendTransactionServiceStats,
566568
) {
567569
// Processing the transactions in batch
568-
let addresses = Self::get_tpu_addresses_with_slots(
570+
let mut addresses = config
571+
.tpu_peers
572+
.as_ref()
573+
.map(|addrs| addrs.iter().map(|a| (a, 0)).collect::<Vec<_>>())
574+
.unwrap_or_default();
575+
let leader_addresses = Self::get_tpu_addresses_with_slots(
569576
tpu_address,
570577
leader_info,
571578
config,
572579
connection_cache.protocol(),
573580
);
581+
addresses.extend(leader_addresses);
574582

575583
let wire_transactions = transactions
576584
.iter()
@@ -583,8 +591,8 @@ impl SendTransactionService {
583591
})
584592
.collect::<Vec<&[u8]>>();
585593

586-
for address in &addresses {
587-
Self::send_transactions(address.0, &wire_transactions, connection_cache, stats);
594+
for (address, _) in &addresses {
595+
Self::send_transactions(address, &wire_transactions, connection_cache, stats);
588596
}
589597
}
590598

@@ -701,14 +709,20 @@ impl SendTransactionService {
701709

702710
let iter = wire_transactions.chunks(config.batch_size);
703711
for chunk in iter {
712+
let mut addresses = config
713+
.tpu_peers
714+
.as_ref()
715+
.map(|addrs| addrs.iter().collect::<Vec<_>>())
716+
.unwrap_or_default();
704717
let mut leader_info_provider = leader_info_provider.lock().unwrap();
705718
let leader_info = leader_info_provider.get_leader_info();
706-
let addresses = Self::get_tpu_addresses(
719+
let leader_addresses = Self::get_tpu_addresses(
707720
tpu_address,
708721
leader_info,
709722
config,
710723
connection_cache.protocol(),
711724
);
725+
addresses.extend(leader_addresses);
712726

713727
for address in &addresses {
714728
Self::send_transactions(address, chunk, connection_cache, stats);

validator/src/cli.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,6 +1045,22 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> {
10451045
.default_value(&default_args.rpc_send_transaction_batch_size)
10461046
.help("The size of transactions to be sent in batch."),
10471047
)
1048+
.arg(
1049+
Arg::with_name("rpc_send_transaction_tpu_peer")
1050+
.long("rpc-send-transaction-tpu-peer")
1051+
.takes_value(true)
1052+
.number_of_values(1)
1053+
.multiple(true)
1054+
.value_name("HOST:PORT")
1055+
.validator(solana_net_utils::is_host_port)
1056+
.help("Peer(s) to broadcast transactions to instead of the current leader")
1057+
)
1058+
.arg(
1059+
Arg::with_name("rpc_send_transaction_also_leader")
1060+
.long("rpc-send-transaction-also-leader")
1061+
.requires("rpc_send_transaction_tpu_peer")
1062+
.help("With `--rpc-send-transaction-tpu-peer HOST:PORT`, also send to the current leader")
1063+
)
10481064
.arg(
10491065
Arg::with_name("rpc_scan_and_fix_roots")
10501066
.long("rpc-scan-and-fix-roots")

validator/src/main.rs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,6 +1266,27 @@ pub fn main() {
12661266
);
12671267
exit(1);
12681268
}
1269+
let rpc_send_transaction_tpu_peers = matches
1270+
.values_of("rpc_send_transaction_tpu_peer")
1271+
.map(|values| {
1272+
values
1273+
.map(solana_net_utils::parse_host_port)
1274+
.collect::<Result<Vec<SocketAddr>, String>>()
1275+
})
1276+
.transpose()
1277+
.unwrap_or_else(|e| {
1278+
eprintln!("failed to parse rpc send-transaction-service tpu peer address: {e}");
1279+
exit(1);
1280+
});
1281+
let rpc_send_transaction_also_leader = matches.is_present("rpc_send_transaction_also_leader");
1282+
let leader_forward_count =
1283+
if rpc_send_transaction_tpu_peers.is_some() && !rpc_send_transaction_also_leader {
1284+
// rpc-sts is configured to send only to specific tpu peers. disable leader forwards
1285+
0
1286+
} else {
1287+
value_t_or_exit!(matches, "rpc_send_transaction_leader_forward_count", u64)
1288+
};
1289+
12691290
let full_api = matches.is_present("full_rpc_api");
12701291

12711292
let mut validator_config = ValidatorConfig {
@@ -1359,11 +1380,7 @@ pub fn main() {
13591380
contact_debug_interval,
13601381
send_transaction_service_config: send_transaction_service::Config {
13611382
retry_rate_ms: rpc_send_retry_rate_ms,
1362-
leader_forward_count: value_t_or_exit!(
1363-
matches,
1364-
"rpc_send_transaction_leader_forward_count",
1365-
u64
1366-
),
1383+
leader_forward_count,
13671384
default_max_retries: value_t!(
13681385
matches,
13691386
"rpc_send_transaction_default_max_retries",
@@ -1377,6 +1394,7 @@ pub fn main() {
13771394
),
13781395
batch_send_rate_ms: rpc_send_batch_send_rate_ms,
13791396
batch_size: rpc_send_batch_size,
1397+
tpu_peers: rpc_send_transaction_tpu_peers,
13801398
},
13811399
no_poh_speed_test: matches.is_present("no_poh_speed_test"),
13821400
no_os_memory_stats_reporting: matches.is_present("no_os_memory_stats_reporting"),

0 commit comments

Comments
 (0)