Skip to content

Commit aba67a7

Browse files
committed
lightningd: rename state_change_entry to channel_state_change, and use pointers.
This name is clearer than the old one. And since the struct contains a string, it's more natural for the struct to be the tal parent of the string so it's a real object. This means we need an array of pointers, so each struct can be its own tal object. wallet_state_change_get is hoisted higher in the code and made static. Signed-off-by: Rusty Russell <[email protected]>
1 parent 0440700 commit aba67a7

File tree

10 files changed

+101
-77
lines changed

10 files changed

+101
-77
lines changed

lightningd/channel.c

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ struct channel *new_unsaved_channel(struct peer *peer,
312312
channel->stable_conn_timer = NULL;
313313
/* Nothing happened yet */
314314
memset(&channel->stats, 0, sizeof(channel->stats));
315-
channel->state_changes = tal_arr(channel, struct state_change_entry, 0);
315+
channel->state_changes = tal_arr(channel, struct channel_state_change *, 0);
316316

317317
/* No shachain yet */
318318
channel->their_shachain.id = 0;
@@ -450,7 +450,7 @@ struct channel *new_channel(struct peer *peer, u64 dbid,
450450
struct peer_update *peer_update STEALS,
451451
u64 last_stable_connection,
452452
const struct channel_stats *stats,
453-
struct state_change_entry *state_changes STEALS)
453+
struct channel_state_change **state_changes STEALS)
454454
{
455455
struct channel *channel = tal(peer->ld, struct channel);
456456
struct amount_msat htlc_min, htlc_max;
@@ -834,6 +834,22 @@ void channel_set_last_tx(struct channel *channel,
834834
channel->last_tx = tal_steal(channel, tx);
835835
}
836836

837+
struct channel_state_change *new_channel_state_change(const tal_t *ctx,
838+
struct timeabs timestamp,
839+
enum channel_state old_state,
840+
enum channel_state new_state,
841+
enum state_change cause,
842+
const char *message TAKES)
843+
{
844+
struct channel_state_change *c = tal(ctx, struct channel_state_change);
845+
c->timestamp = timestamp;
846+
c->old_state = old_state;
847+
c->new_state = new_state;
848+
c->cause = cause;
849+
c->message = tal_strdup(c, message);
850+
return c;
851+
}
852+
837853
void channel_set_state(struct channel *channel,
838854
enum channel_state old_state,
839855
enum channel_state state,
@@ -867,17 +883,19 @@ void channel_set_state(struct channel *channel,
867883

868884
/* plugin notification channel_state_changed and DB entry */
869885
if (state != old_state) { /* see issue #4029 */
870-
struct state_change_entry change;
871-
change.timestamp = time_now();
872-
change.old_state = old_state;
873-
change.new_state = state;
874-
change.cause = reason;
875-
change.message = tal_strdup(channel->state_changes, why);
886+
struct channel_state_change *change;
887+
888+
change = new_channel_state_change(channel->state_changes,
889+
time_now(),
890+
old_state,
891+
state,
892+
reason,
893+
why);
876894
tal_arr_expand(&channel->state_changes, change);
877895

878896
wallet_state_change_add(channel->peer->ld->wallet,
879897
channel->dbid,
880-
change.timestamp,
898+
change->timestamp,
881899
old_state,
882900
state,
883901
reason,
@@ -886,7 +904,7 @@ void channel_set_state(struct channel *channel,
886904
&channel->peer->id,
887905
&channel->cid,
888906
channel->scid,
889-
change.timestamp,
907+
change->timestamp,
890908
old_state,
891909
state,
892910
reason,

lightningd/channel.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,15 @@ struct channel_stats {
115115
struct amount_msat out_msatoshi_offered, out_msatoshi_fulfilled;
116116
};
117117

118+
119+
struct channel_state_change {
120+
struct timeabs timestamp;
121+
enum channel_state old_state;
122+
enum channel_state new_state;
123+
enum state_change cause;
124+
const char *message;
125+
};
126+
118127
struct channel {
119128
/* Inside peer->channels. */
120129
struct list_node list;
@@ -327,7 +336,7 @@ struct channel {
327336
struct channel_stats stats;
328337

329338
/* Our change history. */
330-
struct state_change_entry *state_changes;
339+
struct channel_state_change **state_changes;
331340
};
332341

333342
/* Is channel owned (and should be talking to peer) */
@@ -411,7 +420,7 @@ struct channel *new_channel(struct peer *peer, u64 dbid,
411420
struct peer_update *peer_update STEALS,
412421
u64 last_stable_connection,
413422
const struct channel_stats *stats,
414-
struct state_change_entry *state_changes STEALS);
423+
struct channel_state_change **state_changes STEALS);
415424

416425
/* new_inflight - Create a new channel_inflight for a channel */
417426
struct channel_inflight *new_inflight(struct channel *channel,
@@ -431,6 +440,13 @@ struct channel_inflight *new_inflight(struct channel *channel,
431440
bool i_am_initiator,
432441
bool force_sign_first);
433442

443+
struct channel_state_change *new_channel_state_change(const tal_t *ctx,
444+
struct timeabs timestamp,
445+
enum channel_state old_state,
446+
enum channel_state new_state,
447+
enum state_change cause,
448+
const char *message TAKES);
449+
434450
/* Add a last_tx and sig to an inflight */
435451
void inflight_set_last_tx(struct channel_inflight *inflight,
436452
struct bitcoin_tx *last_tx STEALS,

lightningd/channel_state.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,4 @@ enum state_change {
7373
/* Note: This is very likely a conscious remote decision. */
7474
REASON_ONCHAIN
7575
};
76-
77-
struct state_change_entry {
78-
struct timeabs timestamp;
79-
enum channel_state old_state;
80-
enum channel_state new_state;
81-
enum state_change cause;
82-
char *message;
83-
};
84-
8576
#endif /* LIGHTNING_LIGHTNINGD_CHANNEL_STATE_H */

lightningd/opening_control.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ wallet_commit_channel(struct lightningd *ld,
221221
NULL,
222222
0,
223223
&zero_channel_stats,
224-
tal_arr(NULL, struct state_change_entry, 0));
224+
tal_arr(NULL, struct channel_state_change *, 0));
225225

226226
/* Now we finally put it in the database. */
227227
wallet_channel_insert(ld->wallet, channel);
@@ -1600,7 +1600,7 @@ static struct channel *stub_chan(struct command *cmd,
16001600
NULL,
16011601
0,
16021602
&zero_channel_stats,
1603-
tal_arr(NULL, struct state_change_entry, 0));
1603+
tal_arr(NULL, struct channel_state_change *, 0));
16041604

16051605
/* We don't want to gossip about this, ever. */
16061606
channel->channel_gossip = tal_free(channel->channel_gossip);

lightningd/peer_control.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,16 +1162,17 @@ static void NON_NULL_ARGS(1, 2, 4, 5) json_add_channel(struct command *cmd,
11621162

11631163
json_array_start(response, "state_changes");
11641164
for (size_t i = 0; i < tal_count(channel->state_changes); i++) {
1165+
const struct channel_state_change *change
1166+
= channel->state_changes[i];
11651167
json_object_start(response, NULL);
1166-
json_add_timeiso(response, "timestamp",
1167-
channel->state_changes[i].timestamp);
1168+
json_add_timeiso(response, "timestamp", change->timestamp);
11681169
json_add_string(response, "old_state",
1169-
channel_state_str(channel->state_changes[i].old_state));
1170+
channel_state_str(change->old_state));
11701171
json_add_string(response, "new_state",
1171-
channel_state_str(channel->state_changes[i].new_state));
1172+
channel_state_str(change->new_state));
11721173
json_add_string(response, "cause",
1173-
channel_change_state_reason_str(channel->state_changes[i].cause));
1174-
json_add_string(response, "message", channel->state_changes[i].message);
1174+
channel_change_state_reason_str(change->cause));
1175+
json_add_string(response, "message", change->message);
11751176
json_object_end(response);
11761177
}
11771178
json_array_end(response);

lightningd/test/run-invoice-select-inchan.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,11 +1059,6 @@ char *wallet_offer_find(const tal_t *ctx UNNEEDED,
10591059
enum offer_status *status)
10601060

10611061
{ fprintf(stderr, "wallet_offer_find called!\n"); abort(); }
1062-
/* Generated stub for wallet_state_change_get */
1063-
struct state_change_entry *wallet_state_change_get(const tal_t *ctx UNNEEDED,
1064-
struct wallet *w UNNEEDED,
1065-
u64 channel_id UNNEEDED)
1066-
{ fprintf(stderr, "wallet_state_change_get called!\n"); abort(); }
10671062
/* Generated stub for wallet_total_forward_fees */
10681063
struct amount_msat wallet_total_forward_fees(struct wallet *w UNNEEDED)
10691064
{ fprintf(stderr, "wallet_total_forward_fees called!\n"); abort(); }

wallet/test/run-db.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,16 @@ struct channel *new_channel(struct peer *peer UNNEEDED, u64 dbid UNNEEDED,
193193
struct peer_update *peer_update STEALS UNNEEDED,
194194
u64 last_stable_connection UNNEEDED,
195195
const struct channel_stats *stats UNNEEDED,
196-
struct state_change_entry *state_changes STEALS UNNEEDED)
196+
struct channel_state_change **state_changes STEALS UNNEEDED)
197197
{ fprintf(stderr, "new_channel called!\n"); abort(); }
198+
/* Generated stub for new_channel_state_change */
199+
struct channel_state_change *new_channel_state_change(const tal_t *ctx UNNEEDED,
200+
struct timeabs timestamp UNNEEDED,
201+
enum channel_state old_state UNNEEDED,
202+
enum channel_state new_state UNNEEDED,
203+
enum state_change cause UNNEEDED,
204+
const char *message TAKES UNNEEDED)
205+
{ fprintf(stderr, "new_channel_state_change called!\n"); abort(); }
198206
/* Generated stub for new_coin_wallet_deposit */
199207
struct chain_coin_mvt *new_coin_wallet_deposit(const tal_t *ctx UNNEEDED,
200208
const struct bitcoin_outpoint *outpoint UNNEEDED,

wallet/test/run-wallet.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1998,7 +1998,7 @@ static bool test_channel_inflight_crud(struct lightningd *ld, const tal_t *ctx)
19981998
NULL,
19991999
0,
20002000
stats,
2001-
tal_arr(NULL, struct state_change_entry, 0));
2001+
tal_arr(NULL, struct channel_state_change *, 0));
20022002
db_begin_transaction(w->db);
20032003
CHECK(!wallet_err);
20042004
wallet_channel_insert(w, chan);

wallet/wallet.c

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,6 +1486,41 @@ static struct short_channel_id *db_col_optional_scid(const tal_t *ctx,
14861486
return scid;
14871487
}
14881488

1489+
static struct channel_state_change **wallet_state_change_get(const tal_t *ctx,
1490+
struct wallet *w,
1491+
u64 channel_id)
1492+
{
1493+
struct db_stmt *stmt;
1494+
struct channel_state_change **res = tal_arr(ctx,
1495+
struct channel_state_change *, 0);
1496+
stmt = db_prepare_v2(
1497+
w->db, SQL("SELECT"
1498+
" timestamp,"
1499+
" old_state,"
1500+
" new_state,"
1501+
" cause,"
1502+
" message "
1503+
"FROM channel_state_changes "
1504+
"WHERE channel_id = ? "
1505+
"ORDER BY timestamp ASC;"));
1506+
db_bind_int(stmt, channel_id);
1507+
db_query_prepared(stmt);
1508+
1509+
while (db_step(stmt)) {
1510+
struct channel_state_change *c;
1511+
1512+
c = new_channel_state_change(res,
1513+
db_col_timeabs(stmt, "timestamp"),
1514+
db_col_int(stmt, "old_state"),
1515+
db_col_int(stmt, "new_state"),
1516+
state_change_in_db(db_col_int(stmt, "cause")),
1517+
take(db_col_strdup(NULL, stmt, "message")));
1518+
tal_arr_expand(&res, c);
1519+
}
1520+
tal_free(stmt);
1521+
return res;
1522+
}
1523+
14891524
/**
14901525
* wallet_stmt2channel - Helper to populate a wallet_channel from a `db_stmt`
14911526
*/
@@ -1522,7 +1557,7 @@ static struct channel *wallet_stmt2channel(struct wallet *w, struct db_stmt *stm
15221557
bool ignore_fee_limits;
15231558
struct peer_update *remote_update;
15241559
struct channel_stats stats;
1525-
struct state_change_entry *state_changes;
1560+
struct channel_state_change **state_changes;
15261561

15271562
peer_dbid = db_col_u64(stmt, "peer_id");
15281563
peer = find_peer_by_dbid(w->ld, peer_dbid);
@@ -2464,39 +2499,6 @@ void wallet_state_change_add(struct wallet *w,
24642499
db_exec_prepared_v2(take(stmt));
24652500
}
24662501

2467-
struct state_change_entry *wallet_state_change_get(const tal_t *ctx,
2468-
struct wallet *w,
2469-
u64 channel_id)
2470-
{
2471-
struct db_stmt *stmt;
2472-
struct state_change_entry tmp;
2473-
struct state_change_entry *res = tal_arr(ctx,
2474-
struct state_change_entry, 0);
2475-
stmt = db_prepare_v2(
2476-
w->db, SQL("SELECT"
2477-
" timestamp,"
2478-
" old_state,"
2479-
" new_state,"
2480-
" cause,"
2481-
" message "
2482-
"FROM channel_state_changes "
2483-
"WHERE channel_id = ? "
2484-
"ORDER BY timestamp ASC;"));
2485-
db_bind_int(stmt, channel_id);
2486-
db_query_prepared(stmt);
2487-
2488-
while (db_step(stmt)) {
2489-
tmp.timestamp = db_col_timeabs(stmt, "timestamp");
2490-
tmp.old_state = db_col_int(stmt, "old_state");
2491-
tmp.new_state = db_col_int(stmt, "new_state");
2492-
tmp.cause = state_change_in_db(db_col_int(stmt, "cause"));
2493-
tmp.message = db_col_strdup(res, stmt, "message");
2494-
tal_arr_expand(&res, tmp);
2495-
}
2496-
tal_free(stmt);
2497-
return res;
2498-
}
2499-
25002502
static void wallet_peer_save(struct wallet *w, struct peer *peer)
25012503
{
25022504
const char *addr =

wallet/wallet.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -662,13 +662,6 @@ void wallet_state_change_add(struct wallet *w,
662662
enum state_change cause,
663663
const char *message);
664664

665-
/**
666-
* Gets all state change history entries for a channel from the database
667-
*/
668-
struct state_change_entry *wallet_state_change_get(const tal_t *ctx,
669-
struct wallet *w,
670-
u64 channel_id);
671-
672665
/**
673666
* wallet_delete_peer_if_unused -- After no more channels in peer, forget about it
674667
*/

0 commit comments

Comments
 (0)