Skip to content

Commit ac711a2

Browse files
committed
protofsm: add logging
1 parent 2ef76ce commit ac711a2

File tree

3 files changed

+100
-2
lines changed

3 files changed

+100
-2
lines changed

protofsm/log.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,19 @@ func DisableLog() {
2727
func UseLogger(logger btclog.Logger) {
2828
log = logger
2929
}
30+
31+
// logClosure is used to provide a closure over expensive logging operations
32+
// so they aren't performed when the logging level doesn't warrant it.
33+
type logClosure func() string
34+
35+
// String invokes the underlying function and returns the result.
36+
func (c logClosure) String() string {
37+
return c()
38+
}
39+
40+
// newLogClosure returns a new closure over a function that returns a string
41+
// which itself provides a Stringer interface so that it can be used with the
42+
// logging system.
43+
func newLogClosure(c func() string) logClosure {
44+
return logClosure(c)
45+
}

protofsm/state_machine.go

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/btcsuite/btcd/btcec/v2"
99
"github.com/btcsuite/btcd/chaincfg/chainhash"
1010
"github.com/btcsuite/btcd/wire"
11+
"github.com/davecgh/go-spew/spew"
1112
"github.com/lightningnetwork/lnd/chainntnfs"
1213
"github.com/lightningnetwork/lnd/fn"
1314
"github.com/lightningnetwork/lnd/lnwire"
@@ -214,6 +215,12 @@ func (s *StateMachine[Event, Env]) Stop() {
214215
//
215216
// TODO(roasbeef): bool if processed?
216217
func (s *StateMachine[Event, Env]) SendEvent(event Event) {
218+
log.Debugf("FSM(%v): sending event: %v", s.cfg.Env.Name(),
219+
newLogClosure(func() string {
220+
return spew.Sdump(event)
221+
}),
222+
)
223+
217224
select {
218225
case s.events <- event:
219226
case <-s.quit:
@@ -246,6 +253,12 @@ func (s *StateMachine[Event, Env]) SendMessage(msg lnwire.Message) bool {
246253
return false
247254
}
248255

256+
log.Debugf("FSM(%v): sending msg: %v", s.cfg.Env.Name(),
257+
newLogClosure(func() string {
258+
return spew.Sdump(msg)
259+
}),
260+
)
261+
249262
// Otherwise, try to map the message using the default message mapper.
250263
// If we can't extract an event, then we'll return false to indicate
251264
// that the message wasn't processed.
@@ -305,12 +318,22 @@ func (s *StateMachine[Event, Env]) RemoveStateSub(sub StateSubscriber[
305318
// executeDaemonEvent executes a daemon event, which is a special type of event
306319
// that can be emitted as part of the state transition function of the state
307320
// machine. An error is returned if the type of event is unknown.
308-
func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
321+
func (s *StateMachine[Event, Env]) executeDaemonEvent( //nolint:funlen
322+
event DaemonEvent) error {
323+
309324
switch daemonEvent := event.(type) {
310325
// This is a send message event, so we'll send the event, and also mind
311326
// any preconditions as well as post-send events.
312327
case *SendMsgEvent[Event]:
313328
sendAndCleanUp := func() error {
329+
log.Debugf("FSM(%v): sending message to target(%v): "+
330+
"%v", s.cfg.Env.Name(),
331+
daemonEvent.TargetPeer,
332+
newLogClosure(func() string {
333+
return spew.Sdump(daemonEvent.Msgs)
334+
}),
335+
)
336+
314337
err := s.cfg.Daemon.SendMessages(
315338
daemonEvent.TargetPeer, daemonEvent.Msgs,
316339
)
@@ -327,6 +350,14 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
327350
go func() {
328351
defer s.wg.Done()
329352

353+
log.Debugf("FSM(%v): sending "+
354+
"post-send event: %v",
355+
s.cfg.Env.Name(),
356+
newLogClosure(func() string {
357+
return spew.Sdump(event)
358+
}),
359+
)
360+
330361
s.SendEvent(event)
331362
}()
332363
})
@@ -350,6 +381,9 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
350381
predicateTicker := time.NewTicker(pollInterval)
351382
defer predicateTicker.Stop()
352383

384+
log.Infof("FSM(%v): waiting for send predicate to "+
385+
"be true", s.cfg.Env.Name())
386+
353387
for {
354388
select {
355389
case <-predicateTicker.C:
@@ -361,6 +395,10 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
361395
)
362396

363397
if canSend {
398+
log.Infof("FSM(%v): send "+
399+
"active predicate",
400+
s.cfg.Env.Name())
401+
364402
err := sendAndCleanUp()
365403
if err != nil {
366404
//nolint:lll
@@ -381,6 +419,9 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
381419
// If this is a disable channel event, then we'll disable the channel.
382420
// This is usually done for things like co-op closes.
383421
case *DisableChannelEvent:
422+
log.Debugf("FSM(%v): disabling channel: %v", s.cfg.Env.Name(),
423+
daemonEvent.ChanPoint)
424+
384425
err := s.cfg.Daemon.DisableChannel(daemonEvent.ChanPoint)
385426
if err != nil {
386427
return fmt.Errorf("unable to disable channel: %w", err)
@@ -391,6 +432,9 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
391432
// If this is a broadcast transaction event, then we'll broadcast with
392433
// the label attached.
393434
case *BroadcastTxn:
435+
log.Debugf("FSM(%v): broadcasting txn, txid=%v",
436+
s.cfg.Env.Name(), daemonEvent.Tx.TxHash())
437+
394438
err := s.cfg.Daemon.BroadcastTransaction(
395439
daemonEvent.Tx, daemonEvent.Label,
396440
)
@@ -403,6 +447,9 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
403447
// The state machine has requested a new event to be sent once a
404448
// transaction spending a specified outpoint has confirmed.
405449
case *RegisterSpend[Event]:
450+
log.Debugf("FSM(%v): registering spend: %v", s.cfg.Env.Name(),
451+
daemonEvent.OutPoint)
452+
406453
spendEvent, err := s.cfg.Daemon.RegisterSpendNtfn(
407454
&daemonEvent.OutPoint, daemonEvent.PkScript,
408455
daemonEvent.HeightHint,
@@ -438,6 +485,9 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
438485
// The state machine has requested a new event to be sent once a
439486
// specified txid+pkScript pair has confirmed.
440487
case *RegisterConf[Event]:
488+
log.Debugf("FSM(%v): registering conf: %v", s.cfg.Env.Name(),
489+
daemonEvent.Txid)
490+
441491
numConfs := daemonEvent.NumConfs.UnwrapOr(1)
442492
confEvent, err := s.cfg.Daemon.RegisterConfirmationsNtfn(
443493
&daemonEvent.Txid, daemonEvent.PkScript,
@@ -482,6 +532,12 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
482532
func (s *StateMachine[Event, Env]) applyEvents(currentState State[Event, Env],
483533
newEvent Event) (State[Event, Env], error) {
484534

535+
log.Debugf("FSM(%v): applying new event", s.cfg.Env.Name(),
536+
newLogClosure(func() string {
537+
return spew.Sdump(newEvent)
538+
}),
539+
)
540+
485541
eventQueue := fn.NewQueue(newEvent)
486542

487543
// Given the next event to handle, we'll process the event, then add
@@ -492,6 +548,13 @@ func (s *StateMachine[Event, Env]) applyEvents(currentState State[Event, Env],
492548
//nolint:lll
493549
for nextEvent := eventQueue.Dequeue(); nextEvent.IsSome(); nextEvent = eventQueue.Dequeue() {
494550
err := fn.MapOptionZ(nextEvent, func(event Event) error {
551+
log.Debugf("FSM(%v): processing event: %v",
552+
s.cfg.Env.Name(),
553+
newLogClosure(func() string {
554+
return spew.Sdump(event)
555+
}),
556+
)
557+
495558
// Apply the state transition function of the current
496559
// state given this new event and our existing env.
497560
transition, err := currentState.ProcessEvent(
@@ -509,6 +572,10 @@ func (s *StateMachine[Event, Env]) applyEvents(currentState State[Event, Env],
509572
//
510573
//nolint:lll
511574
err := fn.MapOptionZ(events.ExternalEvents, func(dEvents DaemonEventSet) error {
575+
log.Debugf("FSM(%v): processing "+
576+
"daemon %v daemon events",
577+
s.cfg.Env.Name(), len(dEvents))
578+
512579
for _, dEvent := range dEvents {
513580
err := s.executeDaemonEvent(
514581
dEvent,
@@ -529,6 +596,16 @@ func (s *StateMachine[Event, Env]) applyEvents(currentState State[Event, Env],
529596
//
530597
//nolint:lll
531598
events.InternalEvent.WhenSome(func(inEvent Event) {
599+
log.Debugf("FSM(%v): adding new "+
600+
"internal event to queue: %v",
601+
s.cfg.Env.Name(),
602+
newLogClosure(func() string {
603+
return spew.Sdump(
604+
inEvent,
605+
)
606+
}),
607+
)
608+
532609
eventQueue.Enqueue(inEvent)
533610
})
534611

@@ -564,6 +641,8 @@ func (s *StateMachine[Event, Env]) applyEvents(currentState State[Event, Env],
564641
func (s *StateMachine[Event, Env]) driveMachine() {
565642
defer s.wg.Done()
566643

644+
log.Debugf("FSM(%v): starting state machine", s.cfg.Env.Name())
645+
567646
currentState := s.cfg.InitialState
568647

569648
// Before we start, if we have an init daemon event specified, then

protofsm/state_machine_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,10 @@ func (d *dummyStateStart) ProcessEvent(event dummyEvents, env *dummyEnv,
120120
NewEvents: fn.Some(EmittedEvent[dummyEvents]{
121121
ExternalEvents: fn.Some(DaemonEventSet{
122122
sendEvent, &DisableChannelEvent{},
123-
&BroadcastTxn{}, sendEvent2,
123+
&BroadcastTxn{
124+
Tx: &wire.MsgTx{},
125+
Label: "test",
126+
}, sendEvent2,
124127
}),
125128
}),
126129
}, nil

0 commit comments

Comments
 (0)