mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-03-01 17:47:30 +01:00
gossipd: handle a "push" marker into the gossip_store.
This tells clients to ignore any timestamp_filter and always send this message when it sees it. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
2d8e93687d
commit
bb370e66a8
4 changed files with 29 additions and 10 deletions
|
@ -84,6 +84,7 @@ u8 *gossip_store_next(const tal_t *ctx, struct per_peer_state *pps)
|
||||||
while (!msg) {
|
while (!msg) {
|
||||||
struct gossip_hdr hdr;
|
struct gossip_hdr hdr;
|
||||||
u32 msglen, checksum, timestamp;
|
u32 msglen, checksum, timestamp;
|
||||||
|
bool push;
|
||||||
int type, r;
|
int type, r;
|
||||||
|
|
||||||
r = read(pps->gossip_store_fd, &hdr, sizeof(hdr));
|
r = read(pps->gossip_store_fd, &hdr, sizeof(hdr));
|
||||||
|
@ -99,12 +100,15 @@ u8 *gossip_store_next(const tal_t *ctx, struct per_peer_state *pps)
|
||||||
if (be32_to_cpu(hdr.len) & GOSSIP_STORE_LEN_DELETED_BIT) {
|
if (be32_to_cpu(hdr.len) & GOSSIP_STORE_LEN_DELETED_BIT) {
|
||||||
/* Skip over it. */
|
/* Skip over it. */
|
||||||
lseek(pps->gossip_store_fd,
|
lseek(pps->gossip_store_fd,
|
||||||
be32_to_cpu(hdr.len) & ~GOSSIP_STORE_LEN_DELETED_BIT,
|
be32_to_cpu(hdr.len) & GOSSIP_STORE_LEN_MASK,
|
||||||
SEEK_CUR);
|
SEEK_CUR);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
msglen = be32_to_cpu(hdr.len);
|
msglen = be32_to_cpu(hdr.len);
|
||||||
|
push = (msglen & GOSSIP_STORE_LEN_PUSH_BIT);
|
||||||
|
msglen &= GOSSIP_STORE_LEN_MASK;
|
||||||
|
|
||||||
checksum = be32_to_cpu(hdr.crc);
|
checksum = be32_to_cpu(hdr.crc);
|
||||||
timestamp = be32_to_cpu(hdr.timestamp);
|
timestamp = be32_to_cpu(hdr.timestamp);
|
||||||
msg = tal_arr(ctx, u8, msglen);
|
msg = tal_arr(ctx, u8, msglen);
|
||||||
|
@ -135,7 +139,7 @@ u8 *gossip_store_next(const tal_t *ctx, struct per_peer_state *pps)
|
||||||
&& type != WIRE_CHANNEL_UPDATE
|
&& type != WIRE_CHANNEL_UPDATE
|
||||||
&& type != WIRE_NODE_ANNOUNCEMENT)
|
&& type != WIRE_NODE_ANNOUNCEMENT)
|
||||||
msg = tal_free(msg);
|
msg = tal_free(msg);
|
||||||
else if (!timestamp_filter(pps, timestamp))
|
else if (!push && !timestamp_filter(pps, timestamp))
|
||||||
msg = tal_free(msg);
|
msg = tal_free(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,15 @@ struct per_peer_state;
|
||||||
*/
|
*/
|
||||||
#define GOSSIP_STORE_LEN_DELETED_BIT 0x80000000U
|
#define GOSSIP_STORE_LEN_DELETED_BIT 0x80000000U
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bit of length we use to mark an important record.
|
||||||
|
*/
|
||||||
|
#define GOSSIP_STORE_LEN_PUSH_BIT 0x40000000U
|
||||||
|
|
||||||
|
/* Mask for extracting just the length part of len field */
|
||||||
|
#define GOSSIP_STORE_LEN_MASK \
|
||||||
|
(~(GOSSIP_STORE_LEN_PUSH_BIT | GOSSIP_STORE_LEN_DELETED_BIT))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gossip_hdr -- On-disk format header.
|
* gossip_hdr -- On-disk format header.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -55,11 +55,12 @@ int main(int argc, char *argv[])
|
||||||
struct amount_sat sat;
|
struct amount_sat sat;
|
||||||
u32 msglen = be32_to_cpu(hdr.len);
|
u32 msglen = be32_to_cpu(hdr.len);
|
||||||
u8 *msg, *inner;
|
u8 *msg, *inner;
|
||||||
bool deleted;
|
bool deleted, push;
|
||||||
|
|
||||||
deleted = (msglen & GOSSIP_STORE_LEN_DELETED_BIT);
|
deleted = (msglen & GOSSIP_STORE_LEN_DELETED_BIT);
|
||||||
|
push = (msglen & GOSSIP_STORE_LEN_PUSH_BIT);
|
||||||
|
|
||||||
msglen &= ~GOSSIP_STORE_LEN_DELETED_BIT;
|
msglen &= GOSSIP_STORE_LEN_MASK;
|
||||||
msg = tal_arr(NULL, u8, msglen);
|
msg = tal_arr(NULL, u8, msglen);
|
||||||
if (read(fd, msg, msglen) != msglen)
|
if (read(fd, msg, msglen) != msglen)
|
||||||
errx(1, "%zu: Truncated file?", off);
|
errx(1, "%zu: Truncated file?", off);
|
||||||
|
@ -68,7 +69,9 @@ int main(int argc, char *argv[])
|
||||||
!= crc32c(be32_to_cpu(hdr.timestamp), msg, msglen))
|
!= crc32c(be32_to_cpu(hdr.timestamp), msg, msglen))
|
||||||
warnx("Checksum verification failed");
|
warnx("Checksum verification failed");
|
||||||
|
|
||||||
printf("%zu: %s", off, deleted ? "DELETED " : "");
|
printf("%zu: %s%s", off,
|
||||||
|
deleted ? "DELETED " : "",
|
||||||
|
push ? "PUSH " : "");
|
||||||
if (deleted && !print_deleted) {
|
if (deleted && !print_deleted) {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
goto end;
|
goto end;
|
||||||
|
|
|
@ -157,7 +157,7 @@ static u32 gossip_store_compact_offline(void)
|
||||||
size_t msglen;
|
size_t msglen;
|
||||||
u8 *msg;
|
u8 *msg;
|
||||||
|
|
||||||
msglen = (be32_to_cpu(hdr.len) & ~GOSSIP_STORE_LEN_DELETED_BIT);
|
msglen = (be32_to_cpu(hdr.len) & GOSSIP_STORE_LEN_MASK);
|
||||||
msg = tal_arr(NULL, u8, msglen);
|
msg = tal_arr(NULL, u8, msglen);
|
||||||
if (!read_all(old_fd, msg, msglen)) {
|
if (!read_all(old_fd, msg, msglen)) {
|
||||||
status_broken("gossip_store_compact_offline: reading msg len %zu from store: %s",
|
status_broken("gossip_store_compact_offline: reading msg len %zu from store: %s",
|
||||||
|
@ -272,6 +272,9 @@ static size_t transfer_store_msg(int from_fd, size_t from_off,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Ignore any non-length bits (e.g. push) */
|
||||||
|
msglen &= GOSSIP_STORE_LEN_MASK;
|
||||||
|
|
||||||
/* FIXME: Reuse buffer? */
|
/* FIXME: Reuse buffer? */
|
||||||
msg = tal_arr(tmpctx, u8, sizeof(hdr) + msglen);
|
msg = tal_arr(tmpctx, u8, sizeof(hdr) + msglen);
|
||||||
memcpy(msg, &hdr, sizeof(hdr));
|
memcpy(msg, &hdr, sizeof(hdr));
|
||||||
|
@ -395,7 +398,7 @@ bool gossip_store_compact(struct gossip_store *gs)
|
||||||
u32 msglen, wlen;
|
u32 msglen, wlen;
|
||||||
int msgtype;
|
int msgtype;
|
||||||
|
|
||||||
msglen = (be32_to_cpu(hdr.len) & ~GOSSIP_STORE_LEN_DELETED_BIT);
|
msglen = (be32_to_cpu(hdr.len) & GOSSIP_STORE_LEN_MASK);
|
||||||
if (be32_to_cpu(hdr.len) & GOSSIP_STORE_LEN_DELETED_BIT) {
|
if (be32_to_cpu(hdr.len) & GOSSIP_STORE_LEN_DELETED_BIT) {
|
||||||
off += sizeof(hdr) + msglen;
|
off += sizeof(hdr) + msglen;
|
||||||
deleted++;
|
deleted++;
|
||||||
|
@ -547,7 +550,7 @@ static u32 delete_by_index(struct gossip_store *gs, u32 index, int type)
|
||||||
gs->deleted++;
|
gs->deleted++;
|
||||||
|
|
||||||
return index + sizeof(struct gossip_hdr)
|
return index + sizeof(struct gossip_hdr)
|
||||||
+ (be32_to_cpu(belen) & ~GOSSIP_STORE_LEN_DELETED_BIT);
|
+ (be32_to_cpu(belen) & GOSSIP_STORE_LEN_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gossip_store_delete(struct gossip_store *gs,
|
void gossip_store_delete(struct gossip_store *gs,
|
||||||
|
@ -595,7 +598,7 @@ const u8 *gossip_store_get(const tal_t *ctx,
|
||||||
"/%"PRIu64"",
|
"/%"PRIu64"",
|
||||||
offset, gs->len);
|
offset, gs->len);
|
||||||
|
|
||||||
msglen = be32_to_cpu(hdr.len);
|
msglen = (be32_to_cpu(hdr.len) & GOSSIP_STORE_LEN_MASK);
|
||||||
checksum = be32_to_cpu(hdr.crc);
|
checksum = be32_to_cpu(hdr.crc);
|
||||||
msg = tal_arr(ctx, u8, msglen);
|
msg = tal_arr(ctx, u8, msglen);
|
||||||
if (pread(gs->fd, msg, msglen, offset + sizeof(hdr)) != msglen)
|
if (pread(gs->fd, msg, msglen, offset + sizeof(hdr)) != msglen)
|
||||||
|
@ -651,7 +654,7 @@ u32 gossip_store_load(struct routing_state *rstate, struct gossip_store *gs)
|
||||||
|
|
||||||
gs->writable = false;
|
gs->writable = false;
|
||||||
while (pread(gs->fd, &hdr, sizeof(hdr), gs->len) == sizeof(hdr)) {
|
while (pread(gs->fd, &hdr, sizeof(hdr), gs->len) == sizeof(hdr)) {
|
||||||
msglen = be32_to_cpu(hdr.len) & ~GOSSIP_STORE_LEN_DELETED_BIT;
|
msglen = be32_to_cpu(hdr.len) & GOSSIP_STORE_LEN_MASK;
|
||||||
checksum = be32_to_cpu(hdr.crc);
|
checksum = be32_to_cpu(hdr.crc);
|
||||||
msg = tal_arr(tmpctx, u8, msglen);
|
msg = tal_arr(tmpctx, u8, msglen);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue