Clean up default commitment handling for subscriptions
This commit is contained in:
parent
7befad2f6d
commit
61ab2072bd
|
@ -1,4 +1,7 @@
|
|||
use crate::rpc_response::{Response as RpcResponse, RpcSignatureResult, SlotInfo};
|
||||
use crate::{
|
||||
rpc_config::RpcSignatureSubscribeConfig,
|
||||
rpc_response::{Response as RpcResponse, RpcSignatureResult, SlotInfo},
|
||||
};
|
||||
use log::*;
|
||||
use serde::de::DeserializeOwned;
|
||||
use serde_json::{
|
||||
|
@ -205,6 +208,7 @@ impl PubsubClient {
|
|||
pub fn signature_subscribe(
|
||||
url: &str,
|
||||
signature: &Signature,
|
||||
config: Option<RpcSignatureSubscribeConfig>,
|
||||
) -> Result<
|
||||
(
|
||||
PubsubSignatureResponse,
|
||||
|
@ -226,7 +230,7 @@ impl PubsubClient {
|
|||
"method":format!("{}Subscribe", SIGNATURE_OPERATION),
|
||||
"params":[
|
||||
signature.to_string(),
|
||||
{"enableReceivedNotification": true }
|
||||
config
|
||||
]
|
||||
})
|
||||
.to_string();
|
||||
|
|
|
@ -442,7 +442,15 @@ mod tests {
|
|||
|
||||
let session = create_session();
|
||||
let (subscriber, _id_receiver, receiver) = Subscriber::new_test("signatureNotification");
|
||||
rpc.signature_subscribe(session, subscriber, tx.signatures[0].to_string(), None);
|
||||
rpc.signature_subscribe(
|
||||
session,
|
||||
subscriber,
|
||||
tx.signatures[0].to_string(),
|
||||
Some(RpcSignatureSubscribeConfig {
|
||||
commitment: Some(CommitmentConfig::single()),
|
||||
..RpcSignatureSubscribeConfig::default()
|
||||
}),
|
||||
);
|
||||
|
||||
process_transaction_and_notify(&bank_forks, &tx, &rpc.subscriptions, 0).unwrap();
|
||||
|
||||
|
@ -472,7 +480,7 @@ mod tests {
|
|||
subscriber,
|
||||
tx.signatures[0].to_string(),
|
||||
Some(RpcSignatureSubscribeConfig {
|
||||
commitment: None,
|
||||
commitment: Some(CommitmentConfig::single()),
|
||||
enable_received_notification: Some(true),
|
||||
}),
|
||||
);
|
||||
|
|
|
@ -122,7 +122,7 @@ type RpcRootSubscriptions = RwLock<HashMap<SubscriptionId, Sink<Slot>>>;
|
|||
fn add_subscription<K, S, T>(
|
||||
subscriptions: &mut HashMap<K, HashMap<SubscriptionId, SubscriptionData<S, T>>>,
|
||||
hashmap_key: K,
|
||||
commitment: Option<CommitmentConfig>,
|
||||
commitment: CommitmentConfig,
|
||||
sub_id: SubscriptionId,
|
||||
subscriber: Subscriber<S>,
|
||||
last_notified_slot: Slot,
|
||||
|
@ -132,7 +132,6 @@ fn add_subscription<K, S, T>(
|
|||
S: Clone,
|
||||
{
|
||||
let sink = subscriber.assign_id(sub_id.clone()).unwrap();
|
||||
let commitment = commitment.unwrap_or_else(CommitmentConfig::single);
|
||||
let subscription_data = SubscriptionData {
|
||||
sink,
|
||||
commitment,
|
||||
|
@ -528,11 +527,11 @@ impl RpcSubscriptions {
|
|||
subscriber: Subscriber<Response<UiAccount>>,
|
||||
) {
|
||||
let config = config.unwrap_or_default();
|
||||
let commitment_level = config
|
||||
let commitment = config
|
||||
.commitment
|
||||
.unwrap_or_else(CommitmentConfig::single)
|
||||
.commitment;
|
||||
let slot = match commitment_level {
|
||||
.unwrap_or_else(CommitmentConfig::single_gossip);
|
||||
|
||||
let slot = match commitment.commitment {
|
||||
CommitmentLevel::Max => self
|
||||
.block_commitment_cache
|
||||
.read()
|
||||
|
@ -564,7 +563,7 @@ impl RpcSubscriptions {
|
|||
0
|
||||
};
|
||||
|
||||
let mut subscriptions = if commitment_level == CommitmentLevel::SingleGossip {
|
||||
let mut subscriptions = if commitment.commitment == CommitmentLevel::SingleGossip {
|
||||
self.subscriptions
|
||||
.gossip_account_subscriptions
|
||||
.write()
|
||||
|
@ -572,10 +571,11 @@ impl RpcSubscriptions {
|
|||
} else {
|
||||
self.subscriptions.account_subscriptions.write().unwrap()
|
||||
};
|
||||
|
||||
add_subscription(
|
||||
&mut subscriptions,
|
||||
pubkey,
|
||||
config.commitment,
|
||||
commitment,
|
||||
sub_id,
|
||||
subscriber,
|
||||
last_notified_slot,
|
||||
|
@ -605,12 +605,12 @@ impl RpcSubscriptions {
|
|||
subscriber: Subscriber<Response<RpcKeyedAccount>>,
|
||||
) {
|
||||
let config = config.unwrap_or_default();
|
||||
let commitment_level = config
|
||||
let commitment = config
|
||||
.account_config
|
||||
.commitment
|
||||
.unwrap_or_else(CommitmentConfig::recent)
|
||||
.commitment;
|
||||
let mut subscriptions = if commitment_level == CommitmentLevel::SingleGossip {
|
||||
.unwrap_or_else(CommitmentConfig::single_gossip);
|
||||
|
||||
let mut subscriptions = if commitment.commitment == CommitmentLevel::SingleGossip {
|
||||
self.subscriptions
|
||||
.gossip_program_subscriptions
|
||||
.write()
|
||||
|
@ -618,10 +618,11 @@ impl RpcSubscriptions {
|
|||
} else {
|
||||
self.subscriptions.program_subscriptions.write().unwrap()
|
||||
};
|
||||
|
||||
add_subscription(
|
||||
&mut subscriptions,
|
||||
program_id,
|
||||
config.account_config.commitment,
|
||||
commitment,
|
||||
sub_id,
|
||||
subscriber,
|
||||
0, // last_notified_slot is not utilized for program subscriptions
|
||||
|
@ -657,11 +658,9 @@ impl RpcSubscriptions {
|
|||
.map(|config| (config.commitment, config.enable_received_notification))
|
||||
.unwrap_or_default();
|
||||
|
||||
let commitment_level = commitment
|
||||
.unwrap_or_else(CommitmentConfig::recent)
|
||||
.commitment;
|
||||
let commitment = commitment.unwrap_or_else(CommitmentConfig::single_gossip);
|
||||
|
||||
let mut subscriptions = if commitment_level == CommitmentLevel::SingleGossip {
|
||||
let mut subscriptions = if commitment.commitment == CommitmentLevel::SingleGossip {
|
||||
self.subscriptions
|
||||
.gossip_signature_subscriptions
|
||||
.write()
|
||||
|
@ -669,6 +668,7 @@ impl RpcSubscriptions {
|
|||
} else {
|
||||
self.subscriptions.signature_subscriptions.write().unwrap()
|
||||
};
|
||||
|
||||
add_subscription(
|
||||
&mut subscriptions,
|
||||
signature,
|
||||
|
@ -1286,7 +1286,13 @@ pub(crate) mod tests {
|
|||
);
|
||||
subscriptions.add_program_subscription(
|
||||
solana_stake_program::id(),
|
||||
None,
|
||||
Some(RpcProgramAccountsConfig {
|
||||
account_config: RpcAccountInfoConfig {
|
||||
commitment: Some(CommitmentConfig::recent()),
|
||||
..RpcAccountInfoConfig::default()
|
||||
},
|
||||
..RpcProgramAccountsConfig::default()
|
||||
}),
|
||||
sub_id.clone(),
|
||||
subscriber,
|
||||
);
|
||||
|
@ -1645,13 +1651,22 @@ pub(crate) mod tests {
|
|||
fn test_add_and_remove_subscription() {
|
||||
let mut subscriptions: HashMap<u64, HashMap<SubscriptionId, SubscriptionData<(), ()>>> =
|
||||
HashMap::new();
|
||||
let commitment = CommitmentConfig::single_gossip();
|
||||
|
||||
let num_keys = 5;
|
||||
for key in 0..num_keys {
|
||||
let (subscriber, _id_receiver, _transport_receiver) =
|
||||
Subscriber::new_test("notification");
|
||||
let sub_id = SubscriptionId::Number(key);
|
||||
add_subscription(&mut subscriptions, key, None, sub_id, subscriber, 0, None);
|
||||
add_subscription(
|
||||
&mut subscriptions,
|
||||
key,
|
||||
commitment,
|
||||
sub_id,
|
||||
subscriber,
|
||||
0,
|
||||
None,
|
||||
);
|
||||
}
|
||||
|
||||
// Add another subscription to the "0" key
|
||||
|
@ -1660,7 +1675,7 @@ pub(crate) mod tests {
|
|||
add_subscription(
|
||||
&mut subscriptions,
|
||||
0,
|
||||
None,
|
||||
commitment,
|
||||
extra_sub_id.clone(),
|
||||
subscriber,
|
||||
0,
|
||||
|
|
|
@ -2843,7 +2843,7 @@ After connecting to the RPC PubSub websocket at `ws://<ADDRESS>/`:
|
|||
|
||||
- Submit subscription requests to the websocket using the methods below
|
||||
- Multiple subscriptions may be active at once
|
||||
- Many subscriptions take the optional [`commitment` parameter](jsonrpc-api.md#configuring-state-commitment), defining how finalized a change should be to trigger a notification. For subscriptions, if commitment is unspecified, the default value is `"single"`.
|
||||
- Many subscriptions take the optional [`commitment` parameter](jsonrpc-api.md#configuring-state-commitment), defining how finalized a change should be to trigger a notification. For subscriptions, if commitment is unspecified, the default value is `"singleGossip"`.
|
||||
|
||||
### accountSubscribe
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ use serial_test_derive::serial;
|
|||
use solana_client::{
|
||||
pubsub_client::PubsubClient,
|
||||
rpc_client::RpcClient,
|
||||
rpc_config::RpcProgramAccountsConfig,
|
||||
rpc_config::{RpcProgramAccountsConfig, RpcSignatureSubscribeConfig},
|
||||
rpc_response::RpcSignatureResult,
|
||||
thin_client::{create_client, ThinClient},
|
||||
};
|
||||
|
@ -179,6 +179,10 @@ fn test_local_cluster_signature_subscribe() {
|
|||
let (mut sig_subscribe_client, receiver) = PubsubClient::signature_subscribe(
|
||||
&format!("ws://{}", &non_bootstrap_info.rpc_pubsub.to_string()),
|
||||
&transaction.signatures[0],
|
||||
Some(RpcSignatureSubscribeConfig {
|
||||
commitment: Some(CommitmentConfig::recent()),
|
||||
enable_received_notification: Some(true),
|
||||
}),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
|
|
Loading…
Reference in New Issue