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

lightningnetwork / lnd / 12343072627

15 Dec 2024 11:09PM UTC coverage: 57.504% (-1.1%) from 58.636%
12343072627

Pull #9315

github

yyforyongyu
contractcourt: offer outgoing htlc one block earlier before its expiry

We need to offer the outgoing htlc one block earlier to make sure when
the expiry height hits, the sweeper will not miss sweeping it in the
same block. This also means the outgoing contest resolver now only does
one thing - watch for preimage spend till height expiry-1, which can
easily be moved into the timeout resolver instead in the future.
Pull Request #9315: Implement `blockbeat`

1445 of 2007 new or added lines in 26 files covered. (72.0%)

19246 existing lines in 249 files now uncovered.

102342 of 177975 relevant lines covered (57.5%)

24772.24 hits per line

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

6.5
/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/chainio"
13
        "github.com/lightningnetwork/lnd/chainntnfs"
14
        "github.com/lightningnetwork/lnd/chainreg"
15
        "github.com/lightningnetwork/lnd/chanacceptor"
16
        "github.com/lightningnetwork/lnd/chanbackup"
17
        "github.com/lightningnetwork/lnd/chanfitness"
18
        "github.com/lightningnetwork/lnd/channeldb"
19
        "github.com/lightningnetwork/lnd/channelnotifier"
20
        "github.com/lightningnetwork/lnd/cluster"
21
        "github.com/lightningnetwork/lnd/contractcourt"
22
        "github.com/lightningnetwork/lnd/discovery"
23
        "github.com/lightningnetwork/lnd/funding"
24
        "github.com/lightningnetwork/lnd/graph"
25
        graphdb "github.com/lightningnetwork/lnd/graph/db"
26
        "github.com/lightningnetwork/lnd/healthcheck"
27
        "github.com/lightningnetwork/lnd/htlcswitch"
28
        "github.com/lightningnetwork/lnd/invoices"
29
        "github.com/lightningnetwork/lnd/lncfg"
30
        "github.com/lightningnetwork/lnd/lnrpc/autopilotrpc"
31
        "github.com/lightningnetwork/lnd/lnrpc/chainrpc"
32
        "github.com/lightningnetwork/lnd/lnrpc/devrpc"
33
        "github.com/lightningnetwork/lnd/lnrpc/invoicesrpc"
34
        "github.com/lightningnetwork/lnd/lnrpc/neutrinorpc"
35
        "github.com/lightningnetwork/lnd/lnrpc/peersrpc"
36
        "github.com/lightningnetwork/lnd/lnrpc/routerrpc"
37
        "github.com/lightningnetwork/lnd/lnrpc/signrpc"
38
        "github.com/lightningnetwork/lnd/lnrpc/verrpc"
39
        "github.com/lightningnetwork/lnd/lnrpc/walletrpc"
40
        "github.com/lightningnetwork/lnd/lnwallet"
41
        "github.com/lightningnetwork/lnd/lnwallet/btcwallet"
42
        "github.com/lightningnetwork/lnd/lnwallet/chancloser"
43
        "github.com/lightningnetwork/lnd/lnwallet/chanfunding"
44
        "github.com/lightningnetwork/lnd/lnwallet/rpcwallet"
45
        "github.com/lightningnetwork/lnd/monitoring"
46
        "github.com/lightningnetwork/lnd/netann"
47
        "github.com/lightningnetwork/lnd/peer"
48
        "github.com/lightningnetwork/lnd/peernotifier"
49
        "github.com/lightningnetwork/lnd/routing"
50
        "github.com/lightningnetwork/lnd/routing/blindedpath"
51
        "github.com/lightningnetwork/lnd/routing/localchans"
52
        "github.com/lightningnetwork/lnd/rpcperms"
53
        "github.com/lightningnetwork/lnd/signal"
54
        "github.com/lightningnetwork/lnd/sweep"
55
        "github.com/lightningnetwork/lnd/tor"
56
        "github.com/lightningnetwork/lnd/watchtower"
57
        "github.com/lightningnetwork/lnd/watchtower/wtclient"
58
)
59

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

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

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

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

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

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

112
                interceptor.RequestShutdown()
×
113
        }
114

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

×
UNCOV
251
        root.RegisterSubLogger(subsystem, logger)
×
UNCOV
252
        for _, useLogger := range useLoggers {
×
UNCOV
253
                useLogger(logger)
×
UNCOV
254
        }
×
255
}
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