• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lightningnetwork / lnd / 12312390362

13 Dec 2024 08:44AM UTC coverage: 57.458% (+8.5%) from 48.92%
12312390362

Pull #9343

github

ellemouton
fn: rework the ContextGuard and add tests

In this commit, the ContextGuard struct is re-worked such that the
context that its new main WithCtx method provides is cancelled in sync
with a parent context being cancelled or with it's quit channel being
cancelled. Tests are added to assert the behaviour. In order for the
close of the quit channel to be consistent with the cancelling of the
derived context, the quit channel _must_ be contained internal to the
ContextGuard so that callers are only able to close the channel via the
exposed Quit method which will then take care to first cancel any
derived context that depend on the quit channel before returning.
Pull Request #9343: fn: expand the ContextGuard and add tests

101853 of 177264 relevant lines covered (57.46%)

24972.93 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

6.56
/log.go
1
package lnd
2

3
import (
4
        "github.com/btcsuite/btcd/connmgr"
5
        "github.com/btcsuite/btcd/rpcclient"
6
        btclogv1 "github.com/btcsuite/btclog"
7
        "github.com/btcsuite/btclog/v2"
8
        "github.com/lightninglabs/neutrino"
9
        sphinx "github.com/lightningnetwork/lightning-onion"
10
        "github.com/lightningnetwork/lnd/autopilot"
11
        "github.com/lightningnetwork/lnd/build"
12
        "github.com/lightningnetwork/lnd/chainntnfs"
13
        "github.com/lightningnetwork/lnd/chainreg"
14
        "github.com/lightningnetwork/lnd/chanacceptor"
15
        "github.com/lightningnetwork/lnd/chanbackup"
16
        "github.com/lightningnetwork/lnd/chanfitness"
17
        "github.com/lightningnetwork/lnd/channeldb"
18
        "github.com/lightningnetwork/lnd/channelnotifier"
19
        "github.com/lightningnetwork/lnd/cluster"
20
        "github.com/lightningnetwork/lnd/contractcourt"
21
        "github.com/lightningnetwork/lnd/discovery"
22
        "github.com/lightningnetwork/lnd/funding"
23
        "github.com/lightningnetwork/lnd/graph"
24
        graphdb "github.com/lightningnetwork/lnd/graph/db"
25
        "github.com/lightningnetwork/lnd/healthcheck"
26
        "github.com/lightningnetwork/lnd/htlcswitch"
27
        "github.com/lightningnetwork/lnd/invoices"
28
        "github.com/lightningnetwork/lnd/lncfg"
29
        "github.com/lightningnetwork/lnd/lnrpc/autopilotrpc"
30
        "github.com/lightningnetwork/lnd/lnrpc/chainrpc"
31
        "github.com/lightningnetwork/lnd/lnrpc/devrpc"
32
        "github.com/lightningnetwork/lnd/lnrpc/invoicesrpc"
33
        "github.com/lightningnetwork/lnd/lnrpc/neutrinorpc"
34
        "github.com/lightningnetwork/lnd/lnrpc/peersrpc"
35
        "github.com/lightningnetwork/lnd/lnrpc/routerrpc"
36
        "github.com/lightningnetwork/lnd/lnrpc/signrpc"
37
        "github.com/lightningnetwork/lnd/lnrpc/verrpc"
38
        "github.com/lightningnetwork/lnd/lnrpc/walletrpc"
39
        "github.com/lightningnetwork/lnd/lnwallet"
40
        "github.com/lightningnetwork/lnd/lnwallet/btcwallet"
41
        "github.com/lightningnetwork/lnd/lnwallet/chancloser"
42
        "github.com/lightningnetwork/lnd/lnwallet/chanfunding"
43
        "github.com/lightningnetwork/lnd/lnwallet/rpcwallet"
44
        "github.com/lightningnetwork/lnd/monitoring"
45
        "github.com/lightningnetwork/lnd/netann"
46
        "github.com/lightningnetwork/lnd/peer"
47
        "github.com/lightningnetwork/lnd/peernotifier"
48
        "github.com/lightningnetwork/lnd/routing"
49
        "github.com/lightningnetwork/lnd/routing/blindedpath"
50
        "github.com/lightningnetwork/lnd/routing/localchans"
51
        "github.com/lightningnetwork/lnd/rpcperms"
52
        "github.com/lightningnetwork/lnd/signal"
53
        "github.com/lightningnetwork/lnd/sweep"
54
        "github.com/lightningnetwork/lnd/tor"
55
        "github.com/lightningnetwork/lnd/watchtower"
56
        "github.com/lightningnetwork/lnd/watchtower/wtclient"
57
)
58

59
// replaceableLogger is a thin wrapper around a logger that is used so the
60
// logger can be replaced easily without some black pointer magic.
61
type replaceableLogger struct {
62
        btclog.Logger
63
        subsystem string
64
}
65

66
// Loggers can not be used before the log rotator has been initialized with a
67
// log file. This must be performed early during application startup by
68
// calling InitLogRotator() on the main log writer instance in the config.
69
var (
70
        // lndPkgLoggers is a list of all lnd package level loggers that are
71
        // registered. They are tracked here so they can be replaced once the
72
        // SetupLoggers function is called with the final root logger.
73
        lndPkgLoggers []*replaceableLogger
74

75
        // addLndPkgLogger is a helper function that creates a new replaceable
76
        // main lnd package level logger and adds it to the list of loggers that
77
        // are replaced again later, once the final root logger is ready.
78
        addLndPkgLogger = func(subsystem string) *replaceableLogger {
12✔
79
                l := &replaceableLogger{
12✔
80
                        Logger:    build.NewSubLogger(subsystem, nil),
12✔
81
                        subsystem: subsystem,
12✔
82
                }
12✔
83
                lndPkgLoggers = append(lndPkgLoggers, l)
12✔
84
                return l
12✔
85
        }
12✔
86

87
        // Loggers that need to be accessible from the lnd package can be placed
88
        // here. Loggers that are only used in sub modules can be added directly
89
        // by using the addSubLogger method. We declare all loggers so we never
90
        // run into a nil reference if they are used early. But the SetupLoggers
91
        // function should always be called as soon as possible to finish
92
        // setting them up properly with a root logger.
93
        ltndLog = addLndPkgLogger("LTND")
94
        rpcsLog = addLndPkgLogger("RPCS")
95
        srvrLog = addLndPkgLogger("SRVR")
96
        atplLog = addLndPkgLogger("ATPL")
97
)
98

99
// genSubLogger creates a logger for a subsystem. We provide an instance of
100
// a signal.Interceptor to be able to shutdown in the case of a critical error.
101
func genSubLogger(root *build.SubLoggerManager,
102
        interceptor signal.Interceptor) func(string) btclog.Logger {
×
103

×
104
        // Create a shutdown function which will request shutdown from our
×
105
        // interceptor if it is listening.
×
106
        shutdown := func() {
×
107
                if !interceptor.Listening() {
×
108
                        return
×
109
                }
×
110

111
                interceptor.RequestShutdown()
×
112
        }
113

114
        // Return a function which will create a sublogger from our root
115
        // logger without shutdown fn.
116
        return func(tag string) btclog.Logger {
×
117
                return root.GenSubLogger(tag, shutdown)
×
118
        }
×
119
}
120

121
// SetupLoggers initializes all package-global logger variables.
122
//
123
//nolint:ll
124
func SetupLoggers(root *build.SubLoggerManager, interceptor signal.Interceptor) {
×
125
        genLogger := genSubLogger(root, interceptor)
×
126

×
127
        // Now that we have the proper root logger, we can replace the
×
128
        // placeholder lnd package loggers.
×
129
        for _, l := range lndPkgLoggers {
×
130
                l.Logger = build.NewSubLogger(l.subsystem, genLogger)
×
131
                SetSubLogger(root, l.subsystem, l.Logger)
×
132
        }
×
133

134
        // Initialize loggers from packages outside of `lnd` first. The
135
        // packages below will overwrite the names of the loggers they import.
136
        // For instance, the logger in `neutrino.query` is overwritten by
137
        // `btcwallet.chain`, which is overwritten by `lnwallet`. To ensure the
138
        // overwriting works, we need to initialize the loggers here so they
139
        // can be overwritten later.
140
        AddV1SubLogger(root, "BTCN", interceptor, neutrino.UseLogger)
×
141
        AddV1SubLogger(root, "CMGR", interceptor, connmgr.UseLogger)
×
142
        AddV1SubLogger(root, "RPCC", interceptor, rpcclient.UseLogger)
×
143

×
144
        // Some of the loggers declared in the main lnd package are also used
×
145
        // in sub packages.
×
146
        signal.UseLogger(ltndLog)
×
147
        autopilot.UseLogger(atplLog)
×
148

×
149
        AddSubLogger(root, "LNWL", interceptor, lnwallet.UseLogger)
×
150
        AddSubLogger(root, "DISC", interceptor, discovery.UseLogger)
×
151
        AddSubLogger(root, "NTFN", interceptor, chainntnfs.UseLogger)
×
152
        AddSubLogger(root, "CHDB", interceptor, channeldb.UseLogger)
×
153
        AddSubLogger(root, "HSWC", interceptor, htlcswitch.UseLogger)
×
154
        AddSubLogger(root, "CNCT", interceptor, contractcourt.UseLogger)
×
155
        AddSubLogger(root, "UTXN", interceptor, contractcourt.UseNurseryLogger)
×
156
        AddSubLogger(root, "BRAR", interceptor, contractcourt.UseBreachLogger)
×
157
        AddV1SubLogger(root, "SPHX", interceptor, sphinx.UseLogger)
×
158
        AddSubLogger(root, "SWPR", interceptor, sweep.UseLogger)
×
159
        AddSubLogger(root, "SGNR", interceptor, signrpc.UseLogger)
×
160
        AddSubLogger(root, "WLKT", interceptor, walletrpc.UseLogger)
×
161
        AddSubLogger(root, "ARPC", interceptor, autopilotrpc.UseLogger)
×
162
        AddSubLogger(root, "NRPC", interceptor, neutrinorpc.UseLogger)
×
163
        AddSubLogger(root, "DRPC", interceptor, devrpc.UseLogger)
×
164
        AddSubLogger(root, "INVC", interceptor, invoices.UseLogger)
×
165
        AddSubLogger(root, "NANN", interceptor, netann.UseLogger)
×
166
        AddSubLogger(root, "WTWR", interceptor, watchtower.UseLogger)
×
167
        AddSubLogger(root, "NTFR", interceptor, chainrpc.UseLogger)
×
168
        AddSubLogger(root, "IRPC", interceptor, invoicesrpc.UseLogger)
×
169
        AddSubLogger(root, "CHNF", interceptor, channelnotifier.UseLogger)
×
170
        AddSubLogger(root, "CHBU", interceptor, chanbackup.UseLogger)
×
171
        AddSubLogger(root, "PROM", interceptor, monitoring.UseLogger)
×
172
        AddSubLogger(root, "WTCL", interceptor, wtclient.UseLogger)
×
173
        AddSubLogger(root, "PRNF", interceptor, peernotifier.UseLogger)
×
174
        AddSubLogger(root, "CHFD", interceptor, chanfunding.UseLogger)
×
175
        AddSubLogger(root, "PEER", interceptor, peer.UseLogger)
×
176
        AddSubLogger(root, "CHCL", interceptor, chancloser.UseLogger)
×
177
        AddSubLogger(root, "LCHN", interceptor, localchans.UseLogger)
×
178

×
179
        AddSubLogger(root, routing.Subsystem, interceptor, routing.UseLogger)
×
180
        AddSubLogger(root, routerrpc.Subsystem, interceptor, routerrpc.UseLogger)
×
181
        AddSubLogger(root, chanfitness.Subsystem, interceptor, chanfitness.UseLogger)
×
182
        AddSubLogger(root, verrpc.Subsystem, interceptor, verrpc.UseLogger)
×
183
        AddSubLogger(root, healthcheck.Subsystem, interceptor, healthcheck.UseLogger)
×
184
        AddSubLogger(root, chainreg.Subsystem, interceptor, chainreg.UseLogger)
×
185
        AddSubLogger(root, chanacceptor.Subsystem, interceptor, chanacceptor.UseLogger)
×
186
        AddSubLogger(root, funding.Subsystem, interceptor, funding.UseLogger)
×
187
        AddSubLogger(root, cluster.Subsystem, interceptor, cluster.UseLogger)
×
188
        AddSubLogger(root, rpcperms.Subsystem, interceptor, rpcperms.UseLogger)
×
189
        AddSubLogger(root, tor.Subsystem, interceptor, tor.UseLogger)
×
190
        AddSubLogger(root, btcwallet.Subsystem, interceptor, btcwallet.UseLogger)
×
191
        AddSubLogger(root, rpcwallet.Subsystem, interceptor, rpcwallet.UseLogger)
×
192
        AddSubLogger(root, peersrpc.Subsystem, interceptor, peersrpc.UseLogger)
×
193
        AddSubLogger(root, graph.Subsystem, interceptor, graph.UseLogger)
×
194
        AddSubLogger(root, lncfg.Subsystem, interceptor, lncfg.UseLogger)
×
195
        AddSubLogger(
×
196
                root, blindedpath.Subsystem, interceptor, blindedpath.UseLogger,
×
197
        )
×
198
        AddV1SubLogger(root, graphdb.Subsystem, interceptor, graphdb.UseLogger)
×
199
}
200

201
// AddSubLogger is a helper method to conveniently create and register the
202
// logger of one or more sub systems.
203
func AddSubLogger(root *build.SubLoggerManager, subsystem string,
204
        interceptor signal.Interceptor, useLoggers ...func(btclog.Logger)) {
×
205

×
206
        // genSubLogger will return a callback for creating a logger instance,
×
207
        // which we will give to the root logger.
×
208
        genLogger := genSubLogger(root, interceptor)
×
209

×
210
        // Create and register just a single logger to prevent them from
×
211
        // overwriting each other internally.
×
212
        logger := build.NewSubLogger(subsystem, genLogger)
×
213
        SetSubLogger(root, subsystem, logger, useLoggers...)
×
214
}
×
215

216
// SetSubLogger is a helper method to conveniently register the logger of a
217
// sub system.
218
func SetSubLogger(root *build.SubLoggerManager, subsystem string,
219
        logger btclog.Logger, useLoggers ...func(btclog.Logger)) {
×
220

×
221
        root.RegisterSubLogger(subsystem, logger)
×
222
        for _, useLogger := range useLoggers {
×
223
                useLogger(logger)
×
224
        }
×
225
}
226

227
// AddV1SubLogger is a helper method to conveniently create and register the
228
// logger of one or more sub systems.
229
func AddV1SubLogger(root *build.SubLoggerManager, subsystem string,
230
        interceptor signal.Interceptor, useLoggers ...func(btclogv1.Logger)) {
×
231

×
232
        // genSubLogger will return a callback for creating a logger instance,
×
233
        // which we will give to the root logger.
×
234
        genLogger := genSubLogger(root, interceptor)
×
235

×
236
        // Create and register just a single logger to prevent them from
×
237
        // overwriting each other internally.
×
238
        logger := build.NewSubLogger(subsystem, genLogger)
×
239
        SetV1SubLogger(root, subsystem, logger, useLoggers...)
×
240
}
×
241

242
// SetV1SubLogger is a helper method to conveniently register the logger of a
243
// sub system. Note that the btclog v2 logger implements the btclog v1 logger
244
// which is why we can pass the v2 logger to the UseLogger call-backs that
245
// expect the v1 logger.
246
func SetV1SubLogger(root *build.SubLoggerManager, subsystem string,
247
        logger btclog.Logger, useLoggers ...func(btclogv1.Logger)) {
×
248

×
249
        root.RegisterSubLogger(subsystem, logger)
×
250
        for _, useLogger := range useLoggers {
×
251
                useLogger(logger)
×
252
        }
×
253
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc