mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 05:12:45 +01:00
doc/PLUGINS.md: Mention data_version
field of db_write
, sketch how the backup plugin should work.
ChangeLog-Added: Fully documented `db_write` hooks in `doc/PLUGINS.md`.
This commit is contained in:
parent
d2638c99af
commit
9346043f94
@ -514,16 +514,66 @@ It is currently extremely restricted:
|
||||
commands, as these may become intermingled and break rule #1.
|
||||
3. the hook will be called before your plugin is initialized!
|
||||
|
||||
This hook, unlike all the other hooks, is also strongly synchronous:
|
||||
`lightningd` will stop almost all the other processing until this
|
||||
hook responds.
|
||||
|
||||
```json
|
||||
{
|
||||
"data_version": 42,
|
||||
"writes": [
|
||||
"PRAGMA foreign_keys = ON"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
This hook is intended for creating continuous backups.
|
||||
The intent is that your backup plugin maintains three
|
||||
pieces of information (possibly in separate files):
|
||||
(1) a snapshot of the database, (2) a log of database queries
|
||||
that will bring that snapshot up-to-date, and (3) the previous
|
||||
`data_version`.
|
||||
|
||||
`data_version` is an unsigned 32-bit number that will always
|
||||
increment by 1 each time `db_write` is called.
|
||||
Note that this will wrap around on the limit of 32-bit numbers.
|
||||
|
||||
`writes` is an array of strings, each string being a database query
|
||||
that modifies the database.
|
||||
If the `data_version` above is validated correctly, then you can
|
||||
simply append this to the log of database queries.
|
||||
|
||||
Your plugin **MUST** validate the `data_version`.
|
||||
It **MUST** keep track of the previous `data_version` it got,
|
||||
and:
|
||||
|
||||
1. If the new `data_version` is ***exactly*** one higher than
|
||||
the previous, then this is the ideal case and nothing bad
|
||||
happened and we should save this and continue.
|
||||
2. If the new `data_version` is ***exactly*** the same value
|
||||
as the previous, then the previous set of queries was not
|
||||
committed.
|
||||
Your plugin **MAY** overwrite the previous set of queries with
|
||||
the current set, or it **MAY** overwrite its entire backup
|
||||
with a new snapshot of the database and the current `writes`
|
||||
array (treating this case as if `data_version` were two or
|
||||
more higher than the previous).
|
||||
3. If the new `data_version` is ***less than*** the previous,
|
||||
your plugin **MUST** halt and catch fire, and have the
|
||||
operator inspect what exactly happend here.
|
||||
4. Otherwise, some queries were lost and your plugin **SHOULD**
|
||||
recover by creating a new snapshot of the database: copy the
|
||||
database file, back up the given `writes` array, then delete
|
||||
(or atomically `rename` if in a POSIX filesystem) the previous
|
||||
backups of the database and SQL statements, or you **MAY**
|
||||
fail the hook to abort `lightningd`.
|
||||
|
||||
The "rolling up" of the database could be done periodically as well
|
||||
if the log of SQL statements has grown large.
|
||||
|
||||
Any response but "true" will cause lightningd to error without
|
||||
committing to the database!
|
||||
This is the expected way to halt and catch fire.
|
||||
|
||||
#### `invoice_payment`
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user