Skip to content

Commit cc78a01

Browse files
committed
protofsm: add logging
1 parent 5d13c27 commit cc78a01

File tree

3 files changed

+98
-2
lines changed

3 files changed

+98
-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: 77 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"
@@ -211,6 +212,12 @@ func (s *StateMachine[Event, Env]) Stop() {
211212
//
212213
// TODO(roasbeef): bool if processed?
213214
func (s *StateMachine[Event, Env]) SendEvent(event Event) {
215+
log.Debugf("FSM(%v): sending event: %v", s.cfg.Env.Name(),
216+
newLogClosure(func() string {
217+
return spew.Sdump(event)
218+
}),
219+
)
220+
214221
select {
215222
case s.events <- event:
216223
case <-s.quit:
@@ -243,6 +250,12 @@ func (s *StateMachine[Event, Env]) SendMessage(msg lnwire.Message) bool {
243250
return false
244251
}
245252

253+
log.Debugf("FSM(%v): sending msg: %v", s.cfg.Env.Name(),
254+
newLogClosure(func() string {
255+
return spew.Sdump(msg)
256+
}),
257+
)
258+
246259
// Otherwise, try to map the message using the default message mapper.
247260
// If we can't extract an event, then we'll return false to indicate
248261
// that the message wasn't processed.
@@ -302,12 +315,22 @@ func (s *StateMachine[Event, Env]) RemoveStateSub(sub StateSubscriber[
302315
// executeDaemonEvent executes a daemon event, which is a special type of event
303316
// that can be emitted as part of the state transition function of the state
304317
// machine. An error is returned if the type of event is unknown.
305-
func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
318+
func (s *StateMachine[Event, Env]) executeDaemonEvent( //nolint:funlen
319+
event DaemonEvent) error {
320+
306321
switch daemonEvent := event.(type) {
307322
// This is a send message event, so we'll send the event, and also mind
308323
// any preconditions as well as post-send events.
309324
case *SendMsgEvent[Event]:
310325
sendAndCleanUp := func() error {
326+
log.Debugf("FSM(%v): sending message to target(%v): "+
327+
"%v", s.cfg.Env.Name(),
328+
daemonEvent.TargetPeer,
329+
newLogClosure(func() string {
330+
return spew.Sdump(daemonEvent.Msgs)
331+
}),
332+
)
333+
311334
err := s.cfg.Daemon.SendMessages(
312335
daemonEvent.TargetPeer, daemonEvent.Msgs,
313336
)
@@ -324,6 +347,14 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
324347
go func() {
325348
defer s.wg.Done()
326349

350+
log.Debugf("FSM(%v): sending "+
351+
"post-send event: %v",
352+
s.cfg.Env.Name(),
353+
newLogClosure(func() string {
354+
return spew.Sdump(event)
355+
}),
356+
)
357+
327358
s.SendEvent(event)
328359
}()
329360
})
@@ -347,6 +378,9 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
347378
predicateTicker := time.NewTicker(pollInterval)
348379
defer predicateTicker.Stop()
349380

381+
log.Infof("FSM(%v): waiting for send predicate to "+
382+
"be true", s.cfg.Env.Name())
383+
350384
for {
351385
select {
352386
case <-predicateTicker.C:
@@ -358,6 +392,10 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
358392
)
359393

360394
if canSend {
395+
log.Infof("FSM(%v): send "+
396+
"active predicate",
397+
s.cfg.Env.Name())
398+
361399
err := sendAndCleanUp()
362400
if err != nil {
363401
//nolint:lll
@@ -378,6 +416,9 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
378416
// If this is a broadcast transaction event, then we'll broadcast with
379417
// the label attached.
380418
case *BroadcastTxn:
419+
log.Debugf("FSM(%v): broadcasting txn, txid=%v",
420+
s.cfg.Env.Name(), daemonEvent.Tx.TxHash())
421+
381422
err := s.cfg.Daemon.BroadcastTransaction(
382423
daemonEvent.Tx, daemonEvent.Label,
383424
)
@@ -390,6 +431,9 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
390431
// The state machine has requested a new event to be sent once a
391432
// transaction spending a specified outpoint has confirmed.
392433
case *RegisterSpend[Event]:
434+
log.Debugf("FSM(%v): registering spend: %v", s.cfg.Env.Name(),
435+
daemonEvent.OutPoint)
436+
393437
spendEvent, err := s.cfg.Daemon.RegisterSpendNtfn(
394438
&daemonEvent.OutPoint, daemonEvent.PkScript,
395439
daemonEvent.HeightHint,
@@ -425,6 +469,9 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
425469
// The state machine has requested a new event to be sent once a
426470
// specified txid+pkScript pair has confirmed.
427471
case *RegisterConf[Event]:
472+
log.Debugf("FSM(%v): registering conf: %v", s.cfg.Env.Name(),
473+
daemonEvent.Txid)
474+
428475
numConfs := daemonEvent.NumConfs.UnwrapOr(1)
429476
confEvent, err := s.cfg.Daemon.RegisterConfirmationsNtfn(
430477
&daemonEvent.Txid, daemonEvent.PkScript,
@@ -469,6 +516,12 @@ func (s *StateMachine[Event, Env]) executeDaemonEvent(event DaemonEvent) error {
469516
func (s *StateMachine[Event, Env]) applyEvents(currentState State[Event, Env],
470517
newEvent Event) (State[Event, Env], error) {
471518

519+
log.Debugf("FSM(%v): applying new event", s.cfg.Env.Name(),
520+
newLogClosure(func() string {
521+
return spew.Sdump(newEvent)
522+
}),
523+
)
524+
472525
eventQueue := fn.NewQueue(newEvent)
473526

474527
// Given the next event to handle, we'll process the event, then add
@@ -479,6 +532,13 @@ func (s *StateMachine[Event, Env]) applyEvents(currentState State[Event, Env],
479532
//nolint:lll
480533
for nextEvent := eventQueue.Dequeue(); nextEvent.IsSome(); nextEvent = eventQueue.Dequeue() {
481534
err := fn.MapOptionZ(nextEvent, func(event Event) error {
535+
log.Debugf("FSM(%v): processing event: %v",
536+
s.cfg.Env.Name(),
537+
newLogClosure(func() string {
538+
return spew.Sdump(event)
539+
}),
540+
)
541+
482542
// Apply the state transition function of the current
483543
// state given this new event and our existing env.
484544
transition, err := currentState.ProcessEvent(
@@ -496,6 +556,10 @@ func (s *StateMachine[Event, Env]) applyEvents(currentState State[Event, Env],
496556
//
497557
//nolint:lll
498558
err := fn.MapOptionZ(events.ExternalEvents, func(dEvents DaemonEventSet) error {
559+
log.Debugf("FSM(%v): processing "+
560+
"daemon %v daemon events",
561+
s.cfg.Env.Name(), len(dEvents))
562+
499563
for _, dEvent := range dEvents {
500564
err := s.executeDaemonEvent(
501565
dEvent,
@@ -516,6 +580,16 @@ func (s *StateMachine[Event, Env]) applyEvents(currentState State[Event, Env],
516580
//
517581
//nolint:lll
518582
events.InternalEvent.WhenSome(func(inEvent Event) {
583+
log.Debugf("FSM(%v): adding new "+
584+
"internal event to queue: %v",
585+
s.cfg.Env.Name(),
586+
newLogClosure(func() string {
587+
return spew.Sdump(
588+
inEvent,
589+
)
590+
}),
591+
)
592+
519593
eventQueue.Enqueue(inEvent)
520594
})
521595

@@ -551,6 +625,8 @@ func (s *StateMachine[Event, Env]) applyEvents(currentState State[Event, Env],
551625
func (s *StateMachine[Event, Env]) driveMachine() {
552626
defer s.wg.Done()
553627

628+
log.Debugf("FSM(%v): starting state machine", s.cfg.Env.Name())
629+
554630
currentState := s.cfg.InitialState
555631

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

protofsm/state_machine_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,11 @@ func (d *dummyStateStart) ProcessEvent(event dummyEvents, env *dummyEnv,
119119
},
120120
NewEvents: fn.Some(EmittedEvent[dummyEvents]{
121121
ExternalEvents: fn.Some(DaemonEventSet{
122-
sendEvent, &BroadcastTxn{}, sendEvent2,
122+
sendEvent, sendEvent2,
123+
&BroadcastTxn{
124+
Tx: &wire.MsgTx{},
125+
Label: "test",
126+
},
123127
}),
124128
}),
125129
}, nil

0 commit comments

Comments
 (0)