LND v0.20.1-beta: the cleanup release you should install

bitcoinindex.net · · 4 min read
LND v0.20.1-beta: the cleanup release you should install

Lightning Labs released LND v0.20.1-beta on February 12, 2026. This is a maintenance release. No new features. Just fixes.

If you’re running v0.20.0-beta (released November 2025), you should upgrade. Here’s why.

What v0.20.0-beta changed

v0.20.0-beta was a big release. It migrated the channel graph database from a key-value store to native SQL (Postgres or SQLite). This was an architectural shift aimed at better performance and concurrency.

Big changes expose edge cases. v0.20.0-beta exposed plenty.

The bugs v0.20.1-beta fixes

This release fixes 15 bugs. Some are critical. Some are niche. All matter if they affect your node.

Startup failures

Three bugs could prevent your node from starting at all:

Source node race condition (#10371, #10449): If two goroutines tried to update your node announcement simultaneously, LND would crash on startup. The first fix didn’t catch all cases. A second PR cleaned up the timestamp comparison logic that could still fail under certain conditions.

TLS manager bug (#10399): If only one TLS file (cert or key) existed, LND couldn’t regenerate the missing one. You’d get “file not found” errors. The fix: regenerate both files when either is missing.

These aren’t rare edge cases. They’re “my node won’t start and I don’t know why” failures.

Routing and payment bugs

Four bugs broke routing or payment functionality:

Disabled channels stayed disabled (#10378): Channels with both policies disabled at startup could never route payments, even after policies were re-enabled. You’d lose routing capacity until restart.

Missing payment fields in probes (#10439): The EstimateRouteFee API couldn’t probe Eclair or LDK nodes because it didn’t include payment_address and payment_secret fields. This broke fee estimation for a chunk of the network.

Own channels missing from graph (#10443): After the graph refactor, validation checks were too strict. Your own channel edges might not appear in routing calculations.

Mission control corruption (#10383): Corrupted mission control data would crash LND on startup. The fix: skip corrupted entries and delete them during startup.

Database problems

Three bugs affected SQL backend users (Postgres and SQLite):

Transaction exhaustion (#10428): Improper transaction lifecycle management could exhaust Postgres connections, causing hangs or crashes. This hits production deployments with constrained connection pools.

Graph database race conditions (#10433): Public key caching had check-then-act races. DisconnectBlockAtHeight accessed caches without locking. The fix removed caching from key parsing and added proper mutex protection.

Backwards compatibility for channel edges (#10529): Nodes upgrading from pre-v0.20 versions couldn’t read channel edges because the feature serialization format changed (raw bits to length-prefixed). The fix detects both formats automatically.

Gossiper stability

Two bugs caused gossiper crashes or deadlocks:

Shutdown deadlock (#10540): Certain gossip messages caused multiple error messages on a channel that expected only one. The goroutine would block on the second send, hanging shutdown.

Panic recovery (#10470): Logic errors during message processing could crash the entire gossiper subsystem. The fix adds panic recovery with cleanup and logging.

The gossiper is critical infrastructure. Crashes here fragment your view of the network graph.

Minor fixes

Three smaller bugs rounded out the list:

Duplicate network addresses (#10341): Node announcements could include duplicate addresses, bloating gossip messages.

Slow output resolution (#10387): Resolving to_local and to_remote outputs from force-closed channels took too long, delaying fund recovery.

Zero-timestamp gossip messages (#10469): LND now rejects channel_update and node_announcement messages with zero timestamps, enforcing BOLT 7 spec compliance.

Improvements (not bug fixes)

Three changes improve behavior without fixing bugs:

LSP fee estimation (#10396): EstimateRouteFee now detects Lightning Service Provider setups and probes up to three unique LSPs, returning worst-case fee estimates. This gives you conservative budgeting numbers and griefing protection.

Postgres concurrency tuning (#10394): Two new config options let you control global locks on channel and wallet databases. The channel DB defaults to concurrent access (db.postgres.channeldb-with-global-lock=false). The wallet DB defaults to single-writer (db.postgres.walletdb-with-global-lock=true) because it’s not fully concurrent-safe yet.

Query performance for public node checks (#10356): Switching from OR conditions to UNION ALL speeds up public node lookups, especially in large graphs on SQL backends.

Should you upgrade?

Yes, if you’re running v0.20.0-beta. Especially if:

  • You’re using Postgres or SQLite backends
  • You’ve seen intermittent startup failures
  • You’ve experienced TLS file errors
  • You use the EstimateRouteFee API

You can wait if:

  • You’re on v0.19.x or earlier (v0.20.x is a bigger jump)
  • v0.20.0-beta is stable for you and you’re not hitting any of these bugs

Not affected:

  • Core Lightning operators
  • Eclair operators
  • LDK-based implementations

No database migrations

This is a drop-in replacement. No migrations. Backup your data anyway (you always should), but there’s no schema change risk.

What this release says about v0.20.0

Fifteen bugs in a point release is a lot. The SQL migration was ambitious. It probably shipped before all edge cases were caught. That’s software development. You ship, you learn, you fix.

The gossiper bugs stand out. Panic recovery isn’t something you add unless crashes happened in production. The shutdown deadlock suggests testing didn’t cover all message flow patterns.

The missing payment_address and payment_secret fields in probes is the most surprising. That breaks compatibility with Eclair and LDK, two major implementations. How did that slip through?

But here’s the thing: Lightning Labs shipped the fixes. Quickly. Transparently. With detailed changelogs linking to every PR. That’s what matters.

Looking ahead

v0.20.1-beta is likely not the last point release. v0.20.2-beta will probably follow if more edge cases surface. v0.21.0-beta will be the next feature release, but no timeline has been announced.

The Postgres concurrency controls hint at where LND is heading: enterprise deployments, high-volume routing nodes, and better concurrent access patterns. Once the wallet subsystem is fully concurrent-safe, those global locks can come off.

For now, if you’re on v0.20.0-beta, upgrade. If you’re on v0.19.x or earlier, you can wait. But when you do jump to v0.20.x, make sure you land on v0.20.1-beta or later.

Sources: LND v0.20.1-beta release, Release notes v0.20.1, LND v0.20.0-beta release, RaspiBolt installation guide. Data/status as of March 3, 2026.