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

Commit d1ee7c9

Browse files
committed
LSPS2 client: Drop lock before enqueuing requests
.. which avoids a potential deadlock
1 parent f01639c commit d1ee7c9

File tree

1 file changed

+23
-26
lines changed

1 file changed

+23
-26
lines changed

src/lsps2/client.rs

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,9 @@ where
129129
peer_state_lock.pending_get_info_requests.insert(request_id.clone());
130130
}
131131

132-
self.pending_messages.enqueue(
133-
&counterparty_node_id,
134-
LSPS2Message::Request(
135-
request_id.clone(),
136-
LSPS2Request::GetInfo(GetInfoRequest { token }),
137-
)
138-
.into(),
139-
);
132+
let request = LSPS2Request::GetInfo(GetInfoRequest { token });
133+
let msg = LSPS2Message::Request(request_id.clone(), request).into();
134+
self.pending_messages.enqueue(&counterparty_node_id, msg);
140135

141136
request_id
142137
}
@@ -163,28 +158,30 @@ where
163158
&self, counterparty_node_id: PublicKey, payment_size_msat: Option<u64>,
164159
opening_fee_params: OpeningFeeParams,
165160
) -> Result<RequestId, APIError> {
166-
let mut outer_state_lock = self.per_peer_state.write().unwrap();
167-
let inner_state_lock =
168-
outer_state_lock.entry(counterparty_node_id).or_insert(Mutex::new(PeerState::new()));
169-
let mut peer_state_lock = inner_state_lock.lock().unwrap();
170-
171161
let request_id = crate::utils::generate_request_id(&self.entropy_source);
172162

173-
let jit_channel = InboundJITChannel::new(payment_size_msat);
174-
if peer_state_lock.pending_buy_requests.insert(request_id.clone(), jit_channel).is_some() {
175-
return Err(APIError::APIMisuseError {
176-
err: format!("Failed due to duplicate request_id. This should never happen!"),
177-
});
163+
{
164+
let mut outer_state_lock = self.per_peer_state.write().unwrap();
165+
let inner_state_lock = outer_state_lock
166+
.entry(counterparty_node_id)
167+
.or_insert(Mutex::new(PeerState::new()));
168+
let mut peer_state_lock = inner_state_lock.lock().unwrap();
169+
170+
let jit_channel = InboundJITChannel::new(payment_size_msat);
171+
if peer_state_lock
172+
.pending_buy_requests
173+
.insert(request_id.clone(), jit_channel)
174+
.is_some()
175+
{
176+
return Err(APIError::APIMisuseError {
177+
err: format!("Failed due to duplicate request_id. This should never happen!"),
178+
});
179+
}
178180
}
179181

180-
self.pending_messages.enqueue(
181-
&counterparty_node_id,
182-
LSPS2Message::Request(
183-
request_id.clone(),
184-
LSPS2Request::Buy(BuyRequest { opening_fee_params, payment_size_msat }),
185-
)
186-
.into(),
187-
);
182+
let request = LSPS2Request::Buy(BuyRequest { opening_fee_params, payment_size_msat });
183+
let msg = LSPS2Message::Request(request_id.clone(), request).into();
184+
self.pending_messages.enqueue(&counterparty_node_id, msg);
188185

189186
Ok(request_id)
190187
}

0 commit comments

Comments
 (0)