db: add min/max commitnum fields to channel_htlcs.

And initialize max to current height max when htlcs are already dead.
Turns out (thanks CI!) that MAX() of multiple columns is GREATEST() in
Postgres.  That's clearer (MAX is used elsewhere for single columns),
so translate on the sqlite3 side.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2021-10-13 14:13:13 +10:30 committed by Christian Decker
parent bdaec48400
commit 36b66871a2
2 changed files with 11 additions and 0 deletions

View File

@ -43,6 +43,8 @@ class Sqlite3Rewriter(Rewriter):
r'INSERT INTO[ \t]+(.*)[ \t]+ON CONFLICT.*DO NOTHING;': 'INSERT OR IGNORE INTO \\1;',
# Rewrite "decode('abcd', 'hex')" to become "x'abcd'"
r'decode\((.*),\s*[\'\"]hex[\'\"]\)': 'x\\1',
# GREATEST() of multiple columns is simple MAX in sqlite3.
r'GREATEST\(([^)]*)\)': "MAX(\\1)",
}
return self.rewrite_types(query, typemapping)

View File

@ -835,6 +835,15 @@ static struct migration dbmigrations[] = {
/* HTLCs also need to carry the groupid around so we can
* selectively update them. */
{SQL("ALTER TABLE channel_htlcs ADD groupid BIGINT;"), NULL},
{SQL("ALTER TABLE channel_htlcs ADD COLUMN"
" min_commit_num BIGINT default 0;"), NULL},
{SQL("ALTER TABLE channel_htlcs ADD COLUMN"
" max_commit_num BIGINT default NULL;"), NULL},
/* Set max_commit_num for dead (RCVD_REMOVE_ACK_REVOCATION or SENT_REMOVE_ACK_REVOCATION) HTLCs based on latest indexes */
{SQL("UPDATE channel_htlcs SET max_commit_num ="
" (SELECT GREATEST(next_index_local, next_index_remote)"
" FROM channels WHERE id=channel_id)"
" WHERE (hstate=9 OR hstate=19);"), NULL},
};
/* Leak tracking. */