Skip to content

Commit fc6ee92

Browse files
[Backport] Tweak logs around network (#3784)
This pull request backports #3777 to the `releases/mainnet/v2.0.0-m7` branch.
2 parents efbb583 + 4052de0 commit fc6ee92

File tree

8 files changed

+190
-17
lines changed

8 files changed

+190
-17
lines changed

config/config.go

+4
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ const (
3737

3838
// LogLevelEnvVariable can be used to define logging configuration.
3939
LogLevelEnvVariable = "LOG_LEVEL"
40+
41+
// PubsubLogLevelEnvVariable can be used to define logging configuration
42+
// for the pubsub implementation.
43+
PubsubLogLevelEnvVariable = "PUBSUB_LOG_LEVEL"
4044
)
4145

4246
// Config is the top level config structure.

main.go

+24-4
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,34 @@ import (
1818
var logger = log.Logger("keep-main")
1919

2020
func main() {
21-
err := logging.Configure(os.Getenv(config.LogLevelEnvVariable))
22-
if err != nil {
23-
fmt.Fprintf(os.Stderr, "failed to configure logging: [%v]\n", err)
24-
}
21+
configureLogging()
2522

2623
rootCmd := cmd.Initialize(build.Version, build.Revision)
2724

2825
if err := rootCmd.Execute(); err != nil {
2926
logger.Fatal(err)
3027
}
3128
}
29+
30+
func configureLogging() {
31+
logLevel := "info"
32+
if env := os.Getenv(config.LogLevelEnvVariable); len(env) > 0 {
33+
logLevel = env
34+
}
35+
36+
pubsubLogLevel := "warn"
37+
if env := os.Getenv(config.PubsubLogLevelEnvVariable); len(env) > 0 {
38+
pubsubLogLevel = env
39+
}
40+
41+
levelDirective := fmt.Sprintf(
42+
"%s pubsub=%s",
43+
logLevel,
44+
pubsubLogLevel,
45+
)
46+
47+
err := logging.Configure(levelDirective)
48+
if err != nil {
49+
fmt.Fprintf(os.Stderr, "failed to configure logging: [%v]\n", err)
50+
}
51+
}

pkg/net/libp2p/libp2p.go

+56-8
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
rhost "github.com/libp2p/go-libp2p/p2p/host/routed"
2929
"github.com/libp2p/go-libp2p/p2p/net/connmgr"
3030
"github.com/libp2p/go-libp2p/p2p/net/upgrader"
31+
"github.com/libp2p/go-libp2p/p2p/protocol/ping"
3132

3233
ma "github.com/multiformats/go-multiaddr"
3334
)
@@ -68,6 +69,10 @@ const (
6869
// to prevent uncontrolled message propagation.
6970
const MaximumDisseminationTime = 90
7071

72+
// pingTimeout is the maximum duration of the ping test performed for
73+
// freshly connected peers.
74+
const pingTestTimeout = 60 * time.Second
75+
7176
// Config defines the configuration for the libp2p network provider.
7277
type Config struct {
7378
Bootstrap bool
@@ -320,7 +325,7 @@ func Connect(
320325
return nil, err
321326
}
322327

323-
host.Network().Notify(buildNotifiee())
328+
host.Network().Notify(buildNotifiee(host))
324329

325330
broadcastChannelManager, err := newChannelManager(ctx, identity, host, ticker)
326331
if err != nil {
@@ -528,17 +533,20 @@ func extractMultiAddrFromPeers(peers []string) ([]peer.AddrInfo, error) {
528533
return peerInfos, nil
529534
}
530535

531-
func buildNotifiee() libp2pnet.Notifiee {
536+
func buildNotifiee(libp2pHost host.Host) libp2pnet.Notifiee {
532537
notifyBundle := &libp2pnet.NotifyBundle{}
533538

534539
notifyBundle.ConnectedF = func(_ libp2pnet.Network, connection libp2pnet.Conn) {
535-
logger.Infof(
536-
"established connection to [%v]",
537-
multiaddressWithIdentity(
538-
connection.RemoteMultiaddr(),
539-
connection.RemotePeer(),
540-
),
540+
peerID := connection.RemotePeer()
541+
542+
peerMultiaddress := multiaddressWithIdentity(
543+
connection.RemoteMultiaddr(),
544+
peerID,
541545
)
546+
547+
logger.Infof("established connection to [%v]", peerMultiaddress)
548+
549+
go executePingTest(libp2pHost, peerID, peerMultiaddress)
542550
}
543551
notifyBundle.DisconnectedF = func(_ libp2pnet.Network, connection libp2pnet.Conn) {
544552
logger.Infof(
@@ -553,6 +561,46 @@ func buildNotifiee() libp2pnet.Notifiee {
553561
return notifyBundle
554562
}
555563

564+
func executePingTest(
565+
libp2pHost host.Host,
566+
peerID peer.ID,
567+
peerMultiaddress string,
568+
) {
569+
logger.Infof("starting ping test for [%v]", peerMultiaddress)
570+
571+
ctx, cancelCtx := context.WithTimeout(
572+
context.Background(),
573+
pingTestTimeout,
574+
)
575+
defer cancelCtx()
576+
577+
resultChan := ping.Ping(ctx, libp2pHost, peerID)
578+
579+
select {
580+
case result := <-resultChan:
581+
if result.Error != nil {
582+
logger.Warnf(
583+
"ping test for [%v] failed: [%v]",
584+
peerMultiaddress,
585+
result.Error,
586+
)
587+
} else if result.Error == nil && result.RTT == 0 {
588+
logger.Warnf(
589+
"peer test for [%v] failed without clear reason",
590+
peerMultiaddress,
591+
)
592+
} else {
593+
logger.Infof(
594+
"ping test for [%v] completed with success (RTT [%v])",
595+
peerMultiaddress,
596+
result.RTT,
597+
)
598+
}
599+
case <-ctx.Done():
600+
logger.Warnf("ping test for [%v] timed out", peerMultiaddress)
601+
}
602+
}
603+
556604
func multiaddressWithIdentity(
557605
multiaddress ma.Multiaddr,
558606
peerID peer.ID,

pkg/protocol/announcer/announcer.go

+32
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,35 @@ loop:
172172

173173
return readyMembersIndexes, nil
174174
}
175+
176+
// UnreadyMembers returns a list of member indexes that turned out to be unready
177+
// during the announcement. The list is sorted in ascending order.
178+
func UnreadyMembers(
179+
readyMembers []group.MemberIndex,
180+
groupSize int,
181+
) []group.MemberIndex {
182+
if len(readyMembers) == groupSize {
183+
return []group.MemberIndex{}
184+
}
185+
186+
readyMembersSet := make(map[group.MemberIndex]bool)
187+
for _, memberIndex := range readyMembers {
188+
readyMembersSet[memberIndex] = true
189+
}
190+
191+
unreadyMembers := make([]group.MemberIndex, 0)
192+
193+
for i := 0; i < groupSize; i++ {
194+
memberIndex := group.MemberIndex(i + 1)
195+
196+
if _, isReady := readyMembersSet[memberIndex]; !isReady {
197+
unreadyMembers = append(unreadyMembers, memberIndex)
198+
}
199+
}
200+
201+
sort.Slice(unreadyMembers, func(i, j int) bool {
202+
return unreadyMembers[i] < unreadyMembers[j]
203+
})
204+
205+
return unreadyMembers
206+
}

pkg/protocol/announcer/announcer_test.go

+43
Original file line numberDiff line numberDiff line change
@@ -227,3 +227,46 @@ func TestAnnouncer(t *testing.T) {
227227
})
228228
}
229229
}
230+
231+
func TestUnreadyMembers(t *testing.T) {
232+
tests := map[string]struct {
233+
readyMembers []group.MemberIndex
234+
groupSize int
235+
expected []group.MemberIndex
236+
}{
237+
"all members are ready": {
238+
readyMembers: []group.MemberIndex{1, 2, 3, 4, 5},
239+
groupSize: 5,
240+
expected: []group.MemberIndex{},
241+
},
242+
"some members are not ready": {
243+
readyMembers: []group.MemberIndex{1, 3, 5},
244+
groupSize: 5,
245+
expected: []group.MemberIndex{2, 4},
246+
},
247+
"no members are ready": {
248+
readyMembers: []group.MemberIndex{},
249+
groupSize: 5,
250+
expected: []group.MemberIndex{1, 2, 3, 4, 5},
251+
},
252+
"group size is zero": {
253+
readyMembers: []group.MemberIndex{},
254+
groupSize: 0,
255+
expected: []group.MemberIndex{},
256+
},
257+
}
258+
259+
for testName, test := range tests {
260+
t.Run(testName, func(t *testing.T) {
261+
result := UnreadyMembers(test.readyMembers, test.groupSize)
262+
263+
if !reflect.DeepEqual(test.expected, result) {
264+
t.Errorf(
265+
"unexpected result\nexpected: %v\nactual: %v",
266+
test.expected,
267+
result,
268+
)
269+
}
270+
})
271+
}
272+
}

pkg/tbtc/dkg.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"golang.org/x/exp/maps"
78
"math/big"
89
"sort"
910

@@ -181,10 +182,15 @@ func (de *dkgExecutor) checkEligibility(
181182
}
182183

183184
dkgLogger.Infof(
184-
"selected group members for DKG = %s",
185+
"selected group members (seats) for DKG: [%s]",
185186
groupSelectionResult.OperatorsAddresses,
186187
)
187188

189+
dkgLogger.Infof(
190+
"distinct operators participating in DKG: [%s]",
191+
maps.Keys(groupSelectionResult.OperatorsAddresses.Set()),
192+
)
193+
188194
if len(groupSelectionResult.OperatorsAddresses) > de.groupParameters.GroupSize {
189195
return nil, nil, fmt.Errorf(
190196
"group size larger than supported: [%v]",

pkg/tbtc/dkg_loop.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"crypto/sha256"
66
"encoding/binary"
77
"fmt"
8+
"github.com/keep-network/keep-core/pkg/protocol/announcer"
89
"math/big"
910

1011
"github.com/ipfs/go-log/v2"
@@ -209,6 +210,11 @@ func (drl *dkgRetryLoop) start(
209210
continue
210211
}
211212

213+
unreadyMembersIndexes := announcer.UnreadyMembers(
214+
readyMembersIndexes,
215+
drl.groupParameters.GroupSize,
216+
)
217+
212218
// Check the loop stop signal.
213219
if ctx.Err() != nil {
214220
return nil, ctx.Err()
@@ -217,19 +223,23 @@ func (drl *dkgRetryLoop) start(
217223
if len(readyMembersIndexes) >= drl.groupParameters.GroupQuorum {
218224
drl.logger.Infof(
219225
"[member:%v] completed announcement phase for attempt [%v] "+
220-
"with quorum of [%v] members ready to perform DKG",
226+
"with quorum of [%v] members ready to perform DKG; "+
227+
"following members are not ready: [%v]",
221228
drl.memberIndex,
222229
drl.attemptCounter,
223230
len(readyMembersIndexes),
231+
unreadyMembersIndexes,
224232
)
225233
} else {
226234
drl.logger.Warnf(
227235
"[member:%v] completed announcement phase for attempt [%v] "+
228236
"with non-quorum of [%v] members ready to perform DKG; "+
229-
"starting next attempt",
237+
"following members are not ready: [%v]; "+
238+
"moving to the next attempt",
230239
drl.memberIndex,
231240
drl.attemptCounter,
232241
len(readyMembersIndexes),
242+
unreadyMembersIndexes,
233243
)
234244
continue
235245
}

pkg/tbtc/signing_loop.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"crypto/sha256"
66
"encoding/binary"
77
"fmt"
8+
"github.com/keep-network/keep-core/pkg/protocol/announcer"
89
"math/big"
910
"math/rand"
1011
"sort"
@@ -261,6 +262,11 @@ func (srl *signingRetryLoop) start(
261262
continue
262263
}
263264

265+
unreadyMembersIndexes := announcer.UnreadyMembers(
266+
readyMembersIndexes,
267+
len(srl.signingGroupOperators),
268+
)
269+
264270
// Check the loop stop signal again. The announcement took some time
265271
// and the context may be done now.
266272
if ctx.Err() != nil {
@@ -270,19 +276,23 @@ func (srl *signingRetryLoop) start(
270276
if len(readyMembersIndexes) >= srl.groupParameters.HonestThreshold {
271277
srl.logger.Infof(
272278
"[member:%v] completed announcement phase for attempt [%v] "+
273-
"with honest majority of [%v] members ready to sign",
279+
"with honest majority of [%v] members ready to sign; "+
280+
"following members are not ready: [%v]",
274281
srl.signingGroupMemberIndex,
275282
srl.attemptCounter,
276283
len(readyMembersIndexes),
284+
unreadyMembersIndexes,
277285
)
278286
} else {
279287
srl.logger.Warnf(
280288
"[member:%v] completed announcement phase for attempt [%v] "+
281289
"with minority of [%v] members ready to sign; "+
282-
"starting next attempt",
290+
"following members are not ready: [%v]; "+
291+
"moving to the next attempt",
283292
srl.signingGroupMemberIndex,
284293
srl.attemptCounter,
285294
len(readyMembersIndexes),
295+
unreadyMembersIndexes,
286296
)
287297
continue
288298
}

0 commit comments

Comments
 (0)