Skip to content

Commit ba6c411

Browse files
dangerosshydra-yse
andauthored
fix: pre-check updated fields before committing for real-time sync (#623)
--------- Co-authored-by: yse <hydra_yse@proton.me>
1 parent 9253caa commit ba6c411

File tree

4 files changed

+101
-15
lines changed

4 files changed

+101
-15
lines changed

lib/core/src/persist/chain.rs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::ensure_sdk;
88
use crate::error::PaymentError;
99
use crate::model::*;
1010
use crate::persist::{get_where_clause_state_in, Persister};
11+
use crate::sync::model::data::ChainSyncData;
1112
use crate::sync::model::RecordType;
1213

1314
impl Persister {
@@ -62,8 +63,6 @@ impl Persister {
6263
"UPDATE chain_swaps
6364
SET
6465
description = :description,
65-
payer_amount_sat = :payer_amount_sat,
66-
receiver_amount_sat = :receiver_amount_sat,
6766
accept_zero_conf = :accept_zero_conf,
6867
server_lockup_tx_id = :server_lockup_tx_id,
6968
user_lockup_tx_id = :user_lockup_tx_id,
@@ -77,8 +76,6 @@ impl Persister {
7776
named_params! {
7877
":id": &chain_swap.id,
7978
":description": &chain_swap.description,
80-
":payer_amount_sat": &chain_swap.payer_amount_sat,
81-
":receiver_amount_sat": &chain_swap.receiver_amount_sat,
8279
":accept_zero_conf": &chain_swap.accept_zero_conf,
8380
":server_lockup_tx_id": &chain_swap.server_lockup_tx_id,
8481
":user_lockup_tx_id": &chain_swap.user_lockup_tx_id,
@@ -94,13 +91,28 @@ impl Persister {
9491
}
9592

9693
pub(crate) fn insert_or_update_chain_swap(&self, chain_swap: &ChainSwap) -> Result<()> {
94+
let maybe_swap = self.fetch_chain_swap_by_id(&chain_swap.id)?;
95+
let updated_fields = ChainSyncData::updated_fields(maybe_swap, chain_swap);
96+
9797
let mut con = self.get_connection()?;
9898
let tx = con.transaction_with_behavior(TransactionBehavior::Immediate)?;
9999

100100
Self::insert_or_update_chain_swap_inner(&tx, chain_swap)?;
101-
self.commit_outgoing(&tx, &chain_swap.id, RecordType::Chain, None)?;
102-
tx.commit()?;
103-
self.sync_trigger.try_send(())?;
101+
102+
// Trigger a sync if:
103+
// - updated_fields is None (swap is inserted, not updated)
104+
// - updated_fields in a non empty list of updated fields
105+
let trigger_sync = updated_fields.as_ref().map_or(true, |u| !u.is_empty());
106+
match trigger_sync {
107+
true => {
108+
self.commit_outgoing(&tx, &chain_swap.id, RecordType::Chain, updated_fields)?;
109+
tx.commit()?;
110+
self.sync_trigger.try_send(())?;
111+
}
112+
false => {
113+
tx.commit()?;
114+
}
115+
};
104116

105117
Ok(())
106118
}

lib/core/src/persist/receive.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::ensure_sdk;
88
use crate::error::PaymentError;
99
use crate::model::*;
1010
use crate::persist::{get_where_clause_state_in, Persister};
11+
use crate::sync::model::data::ReceiveSyncData;
1112
use crate::sync::model::RecordType;
1213

1314
impl Persister {
@@ -83,13 +84,28 @@ impl Persister {
8384
}
8485

8586
pub(crate) fn insert_or_update_receive_swap(&self, receive_swap: &ReceiveSwap) -> Result<()> {
87+
let maybe_swap = self.fetch_receive_swap_by_id(&receive_swap.id)?;
88+
let updated_fields = ReceiveSyncData::updated_fields(maybe_swap, receive_swap);
89+
8690
let mut con = self.get_connection()?;
8791
let tx = con.transaction_with_behavior(TransactionBehavior::Immediate)?;
8892

8993
Self::insert_or_update_receive_swap_inner(&tx, receive_swap)?;
90-
self.commit_outgoing(&tx, &receive_swap.id, RecordType::Receive, None)?;
91-
tx.commit()?;
92-
self.sync_trigger.try_send(())?;
94+
95+
// Trigger a sync if:
96+
// - updated_fields is None (swap is inserted, not updated)
97+
// - updated_fields in a non empty list of updated fields
98+
let trigger_sync = updated_fields.as_ref().map_or(true, |u| !u.is_empty());
99+
match trigger_sync {
100+
true => {
101+
self.commit_outgoing(&tx, &receive_swap.id, RecordType::Receive, updated_fields)?;
102+
tx.commit()?;
103+
self.sync_trigger.try_send(())?;
104+
}
105+
false => {
106+
tx.commit()?;
107+
}
108+
};
93109

94110
Ok(())
95111
}

lib/core/src/persist/send.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use serde::{Deserialize, Serialize};
77
use crate::error::PaymentError;
88
use crate::model::*;
99
use crate::persist::{get_where_clause_state_in, Persister};
10+
use crate::sync::model::data::SendSyncData;
1011
use crate::sync::model::RecordType;
1112
use crate::{ensure_sdk, get_updated_fields};
1213

@@ -75,13 +76,28 @@ impl Persister {
7576
}
7677

7778
pub(crate) fn insert_or_update_send_swap(&self, send_swap: &SendSwap) -> Result<()> {
79+
let maybe_swap = self.fetch_send_swap_by_id(&send_swap.id)?;
80+
let updated_fields = SendSyncData::updated_fields(maybe_swap, send_swap);
81+
7882
let mut con = self.get_connection()?;
7983
let tx = con.transaction_with_behavior(rusqlite::TransactionBehavior::Immediate)?;
8084

8185
Self::insert_or_update_send_swap_inner(&tx, send_swap)?;
82-
self.commit_outgoing(&tx, &send_swap.id, RecordType::Send, None)?;
83-
tx.commit()?;
84-
self.sync_trigger.try_send(())?;
86+
87+
// Trigger a sync if:
88+
// - updated_fields is None (swap is inserted, not updated)
89+
// - updated_fields in a non empty list of updated fields
90+
let trigger_sync = updated_fields.as_ref().map_or(true, |u| !u.is_empty());
91+
match trigger_sync {
92+
true => {
93+
self.commit_outgoing(&tx, &send_swap.id, RecordType::Send, updated_fields)?;
94+
tx.commit()?;
95+
self.sync_trigger.try_send(())?;
96+
}
97+
false => {
98+
tx.commit()?;
99+
}
100+
};
85101

86102
Ok(())
87103
}

lib/core/src/sync/model/data.rs

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,27 @@ impl ChainSyncData {
3030
pub(crate) fn merge(&mut self, other: &Self, updated_fields: &[String]) {
3131
for field in updated_fields {
3232
match field.as_str() {
33-
"payer_amount_sat" => self.payer_amount_sat = other.payer_amount_sat,
34-
"receiver_amount_sat" => self.receiver_amount_sat = other.receiver_amount_sat,
3533
"accept_zero_conf" => self.accept_zero_conf = other.accept_zero_conf,
3634
_ => continue,
3735
}
3836
}
3937
}
38+
39+
pub(crate) fn updated_fields(
40+
swap: Option<ChainSwap>,
41+
update: &ChainSwap,
42+
) -> Option<Vec<String>> {
43+
match swap {
44+
Some(swap) => {
45+
let mut updated_fields = vec![];
46+
if update.accept_zero_conf != swap.accept_zero_conf {
47+
updated_fields.push("accept_zero_conf".to_string());
48+
}
49+
Some(updated_fields)
50+
}
51+
None => None,
52+
}
53+
}
4054
}
4155

4256
impl From<ChainSwap> for ChainSyncData {
@@ -114,6 +128,19 @@ impl SendSyncData {
114128
}
115129
}
116130
}
131+
132+
pub(crate) fn updated_fields(swap: Option<SendSwap>, update: &SendSwap) -> Option<Vec<String>> {
133+
match swap {
134+
Some(swap) => {
135+
let mut updated_fields = vec![];
136+
if update.preimage.is_some() && update.preimage != swap.preimage {
137+
updated_fields.push("preimage".to_string());
138+
}
139+
Some(updated_fields)
140+
}
141+
None => None,
142+
}
143+
}
117144
}
118145

119146
impl From<SendSwap> for SendSyncData {
@@ -174,6 +201,21 @@ pub(crate) struct ReceiveSyncData {
174201
pub(crate) description: Option<String>,
175202
}
176203

204+
impl ReceiveSyncData {
205+
pub(crate) fn updated_fields(
206+
swap: Option<ReceiveSwap>,
207+
_update: &ReceiveSwap,
208+
) -> Option<Vec<String>> {
209+
match swap {
210+
Some(_swap) => {
211+
let updated_fields = vec![];
212+
Some(updated_fields)
213+
}
214+
None => None,
215+
}
216+
}
217+
}
218+
177219
impl From<ReceiveSwap> for ReceiveSyncData {
178220
fn from(value: ReceiveSwap) -> Self {
179221
Self {

0 commit comments

Comments
 (0)