From 6dd1555e66e0e9b8bfca82638f5155cabea1111b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hampus=20Sj=C3=B6berg?= Date: Thu, 3 Sep 2020 18:10:30 +0200 Subject: [PATCH] lnd: Call loader.UnloadWallet on shutdown This is required to make restart work for LndMobile builds. Not calling UnloadWallet would make `UnlockWallet` stall forever as the file is already opened. --- lnd.go | 11 +++++++++++ walletunlocker/service.go | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/lnd.go b/lnd.go index d5bc7768..a7dbb69b 100644 --- a/lnd.go +++ b/lnd.go @@ -387,6 +387,11 @@ func Main(cfg *Config, lisCfg ListenerCfg, shutdownChan <-chan struct{}) error { walletInitParams = *params privateWalletPw = walletInitParams.Password publicWalletPw = walletInitParams.Password + defer func() { + if err := walletInitParams.UnloadWallet(); err != nil { + ltndLog.Errorf("Could not unload wallet: %v", err) + } + }() if walletInitParams.RecoveryWindow > 0 { ltndLog.Infof("Wallet recovery mode enabled with "+ @@ -944,6 +949,10 @@ type WalletUnlockParams struct { // ChansToRestore a set of static channel backups that should be // restored before the main server instance starts up. ChansToRestore walletunlocker.ChannelsToRecover + + // UnloadWallet is a function for unloading the wallet, which should + // be called on shutdown. + UnloadWallet func() error } // waitForWalletPassword will spin up gRPC and REST endpoints for the @@ -1105,6 +1114,7 @@ func waitForWalletPassword(cfg *Config, restEndpoints []net.Addr, RecoveryWindow: recoveryWindow, Wallet: newWallet, ChansToRestore: initMsg.ChanBackups, + UnloadWallet: loader.UnloadWallet, }, nil // The wallet has already been created in the past, and is simply being @@ -1115,6 +1125,7 @@ func waitForWalletPassword(cfg *Config, restEndpoints []net.Addr, RecoveryWindow: unlockMsg.RecoveryWindow, Wallet: unlockMsg.Wallet, ChansToRestore: unlockMsg.ChanBackups, + UnloadWallet: unlockMsg.UnloadWallet, }, nil case <-signal.ShutdownChannel(): diff --git a/walletunlocker/service.go b/walletunlocker/service.go index 90e84bae..39a66701 100644 --- a/walletunlocker/service.go +++ b/walletunlocker/service.go @@ -81,6 +81,10 @@ type WalletUnlockMsg struct { // ChanBackups a set of static channel backups that should be received // after the wallet has been unlocked. ChanBackups ChannelsToRecover + + // UnloadWallet is a function for unloading the wallet, which should + // be called on shutdown. + UnloadWallet func() error } // UnlockerService implements the WalletUnlocker service used to provide lnd @@ -346,6 +350,7 @@ func (u *UnlockerService) UnlockWallet(ctx context.Context, Passphrase: password, RecoveryWindow: recoveryWindow, Wallet: unlockedWallet, + UnloadWallet: loader.UnloadWallet, } // Before we return the unlock payload, we'll check if we can extract