Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,14 @@ where
Ok(())
}

/// Check if a PaymentReceived event with the given payment_id already exists in the queue.
pub(crate) fn contains_payment_received(&self, payment_id: &PaymentId) -> bool {
let locked_queue = self.queue.lock().unwrap();
locked_queue.iter().any(|event| {
matches!(event, Event::PaymentReceived { payment_id: Some(id), .. } if id == payment_id)
})
}

fn persist_queue(&self, locked_queue: &VecDeque<Event>) -> Result<(), Error> {
let data = EventQueueSerWrapper(locked_queue).encode();
self.kv_store
Expand Down Expand Up @@ -938,6 +946,18 @@ where
},
}

// Check if a PaymentReceived event for this payment already exists in the queue.
// This handles the case where PaymentClaimed is replayed on restart - we only
// want to queue one PaymentReceived event per payment.
if self.event_queue.contains_payment_received(&payment_id) {
log_debug!(
self.logger,
"Skipping duplicate PaymentReceived for payment {}: event already queued",
payment_id,
);
return Ok(());
}

let event = Event::PaymentReceived {
payment_id: Some(payment_id),
payment_hash,
Expand Down
Loading