16b35f6b2b
Nodes syncing from zero would accept blocks normally up to ~6000 then stall permanently with askfor_queue=0 and no new blocks. Root cause: a broken feedback loop between the header planner and block downloader. Blocks consume entries from mapHeaderSync (MAX 15000) while getheaders refills only 2000 at a time; when the cache drains, hashBestHeaderSync falls to 0 and every refill site is guarded on it being non-zero, so the pipeline deadlocks with no recovery path. Recovery paths added: - ProcessBlock: when the cache is empty during IBD after accepting a block, broadcast getheaders to all full-node peers. This restarts the planner at the exact point it dies. - Stall detection: send getheaders alongside the existing getblocks. getblocks alone cannot refill the header cache. - SendMessages: belt-and-suspenders, re-request headers every 30s while hashBestHeaderSync == 0 in IBD, independent of stall state. Also fix a secondary issue: GetHeaderSyncDownloadPath walks back from the tip and breaks on the first TTL-evicted entry. The accumulated partial tail has a parent that is neither in mapBlockIndex nor mapHeaderSync, so requesting those blocks would produce orphans. Discard the partial path on a gap; the recovery paths above will re-request the missing range. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
20 lines
529 B
C
20 lines
529 B
C
#ifndef CLIENTVERSION_H
|
|
#define CLIENTVERSION_H
|
|
|
|
//
|
|
// client versioning
|
|
//
|
|
|
|
// These need to be macros, as version.cpp's and triangles-qt.rc's voodoo requires it
|
|
#define CLIENT_VERSION_MAJOR 5
|
|
#define CLIENT_VERSION_MINOR 9
|
|
#define CLIENT_VERSION_REVISION 2
|
|
#define CLIENT_VERSION_BUILD 0
|
|
|
|
// Converts the parameter X to a string after macro replacement on X has been performed.
|
|
// Don't merge these into one macro!
|
|
#define STRINGIZE(X) DO_STRINGIZE(X)
|
|
#define DO_STRINGIZE(X) #X
|
|
|
|
#endif // CLIENTVERSION_H
|