@@ -11,6 +11,7 @@ import (
11
11
"context"
12
12
"errors"
13
13
"fmt"
14
+ "math"
14
15
"strconv"
15
16
"strings"
16
17
"sync"
@@ -91,22 +92,40 @@ type startedInformation struct {
91
92
cmdName string
92
93
documentSequenceIncluded bool
93
94
connID string
94
- serverConnID * int32
95
+ driverConnectionID uint64 // TODO(GODRIVER-2824): change type to int64.
96
+ serverConnID * int64
95
97
redacted bool
96
98
serviceID * primitive.ObjectID
97
99
}
98
100
99
101
// finishedInformation keeps track of all of the information necessary for monitoring success and failure events.
100
102
type finishedInformation struct {
101
- cmdName string
102
- requestID int32
103
- response bsoncore.Document
104
- cmdErr error
105
- connID string
106
- serverConnID * int32
107
- startTime time.Time
108
- redacted bool
109
- serviceID * primitive.ObjectID
103
+ cmdName string
104
+ requestID int32
105
+ response bsoncore.Document
106
+ cmdErr error
107
+ connID string
108
+ driverConnectionID uint64 // TODO(GODRIVER-2824): change type to int64.
109
+ serverConnID * int64
110
+ startTime time.Time
111
+ redacted bool
112
+ serviceID * primitive.ObjectID
113
+ }
114
+
115
+ // convertInt64PtrToInt32Ptr will convert an int64 pointer reference to an int32 pointer
116
+ // reference. If the int64 value cannot be converted to int32 without causing
117
+ // an overflow, then this function will return nil.
118
+ func convertInt64PtrToInt32Ptr (i64 * int64 ) * int32 {
119
+ if i64 == nil {
120
+ return nil
121
+ }
122
+
123
+ if * i64 > math .MaxInt32 || * i64 < math .MinInt32 {
124
+ return nil
125
+ }
126
+
127
+ i32 := int32 (* i64 )
128
+ return & i32
110
129
}
111
130
112
131
// ResponseInfo contains the context required to parse a server response.
@@ -552,6 +571,7 @@ func (op Operation) Execute(ctx context.Context) error {
552
571
553
572
// set extra data and send event if possible
554
573
startedInfo .connID = conn .ID ()
574
+ startedInfo .driverConnectionID = conn .DriverConnectionID ()
555
575
startedInfo .cmdName = op .getCommandName (startedInfo .cmd )
556
576
op .cmdName = startedInfo .cmdName
557
577
startedInfo .redacted = op .redactCommand (startedInfo .cmdName , startedInfo .cmd )
@@ -574,13 +594,14 @@ func (op Operation) Execute(ctx context.Context) error {
574
594
}
575
595
576
596
finishedInfo := finishedInformation {
577
- cmdName : startedInfo .cmdName ,
578
- requestID : startedInfo .requestID ,
579
- startTime : time .Now (),
580
- connID : startedInfo .connID ,
581
- serverConnID : startedInfo .serverConnID ,
582
- redacted : startedInfo .redacted ,
583
- serviceID : startedInfo .serviceID ,
597
+ cmdName : startedInfo .cmdName ,
598
+ requestID : startedInfo .requestID ,
599
+ startTime : time .Now (),
600
+ connID : startedInfo .connID ,
601
+ driverConnectionID : startedInfo .driverConnectionID ,
602
+ serverConnID : startedInfo .serverConnID ,
603
+ redacted : startedInfo .redacted ,
604
+ serviceID : startedInfo .serviceID ,
584
605
}
585
606
586
607
// Check for possible context error. If no context error, check if there's enough time to perform a
@@ -1704,7 +1725,7 @@ func (op Operation) publishStartedEvent(ctx context.Context, info startedInforma
1704
1725
CommandName : info .cmdName ,
1705
1726
RequestID : int64 (info .requestID ),
1706
1727
ConnectionID : info .connID ,
1707
- ServerConnectionID : info .serverConnID ,
1728
+ ServerConnectionID : convertInt64PtrToInt32Ptr ( info .serverConnID ) ,
1708
1729
ServiceID : info .serviceID ,
1709
1730
}
1710
1731
op .CommandMonitor .Started (ctx , started )
@@ -1732,7 +1753,7 @@ func (op Operation) publishFinishedEvent(ctx context.Context, info finishedInfor
1732
1753
RequestID : int64 (info .requestID ),
1733
1754
ConnectionID : info .connID ,
1734
1755
DurationNanos : durationNanos ,
1735
- ServerConnectionID : info .serverConnID ,
1756
+ ServerConnectionID : convertInt64PtrToInt32Ptr ( info .serverConnID ) ,
1736
1757
ServiceID : info .serviceID ,
1737
1758
}
1738
1759
0 commit comments