@@ -3,6 +3,7 @@ package util
3
3
import (
4
4
"context"
5
5
6
+ "github.com/10gen/migration-verifier/internal/logger"
6
7
"github.com/10gen/migration-verifier/mbson"
7
8
"github.com/pkg/errors"
8
9
"github.com/samber/lo"
@@ -22,15 +23,22 @@ const (
22
23
TopologyReplset ClusterTopology = "replset"
23
24
)
24
25
25
- func GetClusterInfo (ctx context.Context , client * mongo.Client ) (ClusterInfo , error ) {
26
+ func GetClusterInfo (ctx context.Context , logger * logger. Logger , client * mongo.Client ) (ClusterInfo , error ) {
26
27
va , err := getVersionArray (ctx , client )
27
28
if err != nil {
28
29
return ClusterInfo {}, errors .Wrap (err , "failed to fetch version array" )
29
30
}
30
31
31
- topology , err := getTopology (ctx , client )
32
+ topology , err := getTopology (ctx , "hello" , client )
32
33
if err != nil {
33
- return ClusterInfo {}, errors .Wrap (err , "failed to determine topology" )
34
+ logger .Info ().
35
+ Err (err ).
36
+ Msgf ("Failed to learn topology via %#q; falling back to %#q." , "hello" , "isMaster" )
37
+
38
+ topology , err = getTopology (ctx , "isMaster" , client )
39
+ if err != nil {
40
+ return ClusterInfo {}, errors .Wrapf (err , "failed to learn topology via %#q" , "isMaster" )
41
+ }
34
42
}
35
43
36
44
return ClusterInfo {
@@ -56,23 +64,22 @@ func getVersionArray(ctx context.Context, client *mongo.Client) ([]int, error) {
56
64
return va , nil
57
65
}
58
66
59
- func getTopology (ctx context.Context , client * mongo.Client ) (ClusterTopology , error ) {
67
+ func getTopology (ctx context.Context , cmdName string , client * mongo.Client ) (ClusterTopology , error ) {
68
+
60
69
resp := client .Database ("admin" ).RunCommand (
61
70
ctx ,
62
- bson.D {{"hello" , 1 }},
71
+ bson.D {{cmdName , 1 }},
63
72
)
64
73
65
- hello := struct {
66
- Msg string
67
- }{}
74
+ raw , err := resp .Raw ()
75
+ if err != nil {
76
+ return "" , errors .Wrapf (err , "failed learn topology via %#q" , cmdName )
77
+ }
68
78
69
- if err := resp .Decode (& hello ); err != nil {
70
- return "" , errors .Wrapf (
71
- err ,
72
- "failed to decode %#q response" ,
73
- "hello" ,
74
- )
79
+ hasMsg , err := mbson .RawContains (raw , "msg" )
80
+ if err != nil {
81
+ return "" , errors .Wrapf (err , "failed to check for %#q in %#q response (%v)" , "msg" , cmdName , raw )
75
82
}
76
83
77
- return lo .Ternary (hello . Msg == "isdbgrid" , TopologySharded , TopologyReplset ), nil
84
+ return lo .Ternary (hasMsg , TopologySharded , TopologyReplset ), nil
78
85
}
0 commit comments