Skip to content

Commit 74cffef

Browse files
author
iwysiu
committed
GODRIVER-1215 parse lastWriteDate from isMaster correctly
Change-Id: If1f5b0b7fb7561dda8cfaf0dd4fd88ae18f2d60b
1 parent 7907d52 commit 74cffef

File tree

5 files changed

+58
-64
lines changed

5 files changed

+58
-64
lines changed

internal/results.go

Lines changed: 0 additions & 54 deletions
This file was deleted.

mongo/client_internal_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,3 +735,31 @@ func TestEndSessions(t *testing.T) {
735735

736736
require.Equal(t, "endSessions", started.CommandName)
737737
}
738+
739+
func TestIsMaster(t *testing.T) {
740+
if os.Getenv("TOPOLOGY") != "replica_set" {
741+
t.Skip("Needs to run on a replica set")
742+
}
743+
cs := testutil.ConnString(t)
744+
client, err := NewClient(options.Client().ApplyURI(cs.String()))
745+
require.NoError(t, err)
746+
err = client.Connect(nil)
747+
require.NoError(t, err)
748+
749+
coll := createTestCollection(t, nil, nil)
750+
skipIfBelow34(t, coll.db)
751+
_, err = coll.InsertOne(
752+
context.Background(),
753+
bsonx.Doc{{"x", bsonx.Int32(1)}},
754+
)
755+
require.NoError(t, err)
756+
757+
isMaster := operation.NewIsMaster().ClusterClock(client.clock).Deployment(client.topology).
758+
AppName(cs.AppName).Compressors(cs.Compressors)
759+
760+
err = isMaster.Execute(ctx)
761+
require.NoError(t, err)
762+
763+
res := isMaster.Result("")
764+
require.False(t, res.LastWriteTime.IsZero())
765+
}

x/mongo/driver/description/server.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,21 @@ func NewServer(addr address.Address, response bsoncore.Document) Server {
121121
desc.LastError = fmt.Errorf("expected 'isreplicaset' to be a boolean but it's a BSON %s", element.Value().Type)
122122
return desc
123123
}
124-
case "lastWriteDate":
125-
dt, ok := element.Value().DateTimeOK()
124+
case "lastWrite":
125+
lastWrite, ok := element.Value().DocumentOK()
126126
if !ok {
127-
desc.LastError = fmt.Errorf("expected 'lastWriteDate' to be a datetime but it's a BSON %s", element.Value().Type)
127+
desc.LastError = fmt.Errorf("expected 'lastWrite' to be a document but it's a BSON %s", element.Value().Type)
128128
return desc
129129
}
130-
desc.LastWriteTime = time.Unix(dt/1000, dt%1000*1000000).UTC()
130+
dateTime, err := lastWrite.LookupErr("lastWriteDate")
131+
if err == nil {
132+
dt, ok := dateTime.DateTimeOK()
133+
if !ok {
134+
desc.LastError = fmt.Errorf("expected 'lastWriteDate' to be a datetime but it's a BSON %s", dateTime.Type)
135+
return desc
136+
}
137+
desc.LastWriteTime = time.Unix(dt/1000, dt%1000*1000000).UTC()
138+
}
131139
case "logicalSessionTimeoutMinutes":
132140
i64, ok := element.Value().AsInt64OK()
133141
if !ok {

x/mongo/driver/operation/ismaster.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func (im *IsMaster) Deployment(d driver.Deployment) *IsMaster {
6666
return im
6767
}
6868

69-
// Result returns the result of executing this operaiton.
69+
// Result returns the result of executing this operation.
7070
func (im *IsMaster) Result(addr address.Address) description.Server {
7171
desc := description.Server{Addr: addr, CanonicalAddr: addr, LastUpdateTime: time.Now().UTC()}
7272
elements, err := im.res.Elements()
@@ -132,13 +132,21 @@ func (im *IsMaster) Result(addr address.Address) description.Server {
132132
desc.LastError = fmt.Errorf("expected 'isreplicaset' to be a boolean but it's a BSON %s", element.Value().Type)
133133
return desc
134134
}
135-
case "lastWriteDate":
136-
dt, ok := element.Value().DateTimeOK()
135+
case "lastWrite":
136+
lastWrite, ok := element.Value().DocumentOK()
137137
if !ok {
138-
desc.LastError = fmt.Errorf("expected 'lastWriteDate' to be a datetime but it's a BSON %s", element.Value().Type)
138+
desc.LastError = fmt.Errorf("expected 'lastWrite' to be a document but it's a BSON %s", element.Value().Type)
139139
return desc
140140
}
141-
desc.LastWriteTime = time.Unix(dt/1000, dt%1000*1000000).UTC()
141+
dateTime, err := lastWrite.LookupErr("lastWriteDate")
142+
if err == nil {
143+
dt, ok := dateTime.DateTimeOK()
144+
if !ok {
145+
desc.LastError = fmt.Errorf("expected 'lastWriteDate' to be a datetime but it's a BSON %s", dateTime.Type)
146+
return desc
147+
}
148+
desc.LastWriteTime = time.Unix(dt/1000, dt%1000*1000000).UTC()
149+
}
142150
case "logicalSessionTimeoutMinutes":
143151
i64, ok := element.Value().AsInt64OK()
144152
if !ok {

x/mongo/driver/topology/sdam_spec_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ type IsMaster struct {
3939
Hosts []string `bson:"hosts,omitempty"`
4040
IsMaster bool `bson:"ismaster,omitempty"`
4141
IsReplicaSet bool `bson:"isreplicaset,omitempty"`
42-
LastWriteTimestamp time.Time `bson:"lastWriteDate,omitempty"`
42+
LastWrite *lastWriteDate `bson:"lastWrite,omitempty"`
4343
LogicalSessionTimeoutMinutes uint32 `bson:"logicalSessionTimeoutMinutes,omitempty"`
4444
MaxBSONObjectSize uint32 `bson:"maxBsonObjectSize,omitempty"`
4545
MaxMessageSizeBytes uint32 `bson:"maxMessageSizeBytes,omitempty"`
@@ -58,6 +58,10 @@ type IsMaster struct {
5858
Tags map[string]string `bson:"tags,omitempty"`
5959
}
6060

61+
type lastWriteDate struct {
62+
LastWriteDate time.Time `bson:"lastWriteDate"`
63+
}
64+
6165
type server struct {
6266
Type string
6367
SetName string

0 commit comments

Comments
 (0)