@@ -15,15 +15,19 @@ import (
15
15
// or due of timeout. The Timeout is configurable, and it is calculated client side.
16
16
type unConfirmed struct {
17
17
messages map [int64 ]* ConfirmationStatus
18
+ tmp []* ConfirmationStatus
19
+ tmpMutex sync.Mutex
18
20
mutex sync.RWMutex
19
21
}
20
22
21
- const DefaultUnconfirmedSize = 10000
23
+ const DefaultUnconfirmedSize = 10_000
22
24
23
25
func newUnConfirmed () * unConfirmed {
24
26
25
27
r := & unConfirmed {
26
28
messages : make (map [int64 ]* ConfirmationStatus , DefaultUnconfirmedSize ),
29
+ tmp : []* ConfirmationStatus {},
30
+ tmpMutex : sync.Mutex {},
27
31
mutex : sync.RWMutex {},
28
32
}
29
33
@@ -32,15 +36,16 @@ func newUnConfirmed() *unConfirmed {
32
36
33
37
func (u * unConfirmed ) addFromSequence (message * messageSequence , producerID uint8 ) {
34
38
35
- u .mutex .Lock ()
36
- u .messages [message .publishingId ] = & ConfirmationStatus {
39
+ u .tmpMutex .Lock ()
40
+ u .tmp = append (u .tmp , & ConfirmationStatus {
41
+ //u.messages[message.publishingId] = &ConfirmationStatus{
37
42
inserted : time .Now (),
38
43
message : * message .refMessage ,
39
44
producerID : producerID ,
40
45
publishingId : message .publishingId ,
41
46
confirmed : false ,
42
- }
43
- u .mutex .Unlock ()
47
+ })
48
+ u .tmpMutex .Unlock ()
44
49
}
45
50
46
51
func (u * unConfirmed ) link (from int64 , to int64 ) {
@@ -52,11 +57,13 @@ func (u *unConfirmed) link(from int64, to int64) {
52
57
}
53
58
}
54
59
55
- func (u * unConfirmed ) extractWithConfirms (id []int64 ) []* ConfirmationStatus {
60
+ func (u * unConfirmed ) extractWithConfirms (ids []int64 ) []* ConfirmationStatus {
56
61
u .mutex .Lock ()
57
62
defer u .mutex .Unlock ()
58
63
var res []* ConfirmationStatus
59
- for _ , v := range id {
64
+ u .fromTmpToMap ()
65
+
66
+ for _ , v := range ids {
60
67
m := u .extract (v , 0 , true )
61
68
if m != nil {
62
69
res = append (res , m )
@@ -69,9 +76,19 @@ func (u *unConfirmed) extractWithConfirms(id []int64) []*ConfirmationStatus {
69
76
70
77
}
71
78
79
+ func (u * unConfirmed ) fromTmpToMap () {
80
+ u .tmpMutex .Lock ()
81
+ defer u .tmpMutex .Unlock ()
82
+ for i := range u .tmp {
83
+ u .messages [u .tmp [i ].publishingId ] = u .tmp [i ]
84
+ }
85
+ u .tmp = u .tmp [:0 ]
86
+ }
87
+
72
88
func (u * unConfirmed ) extractWithError (id int64 , errorCode uint16 ) * ConfirmationStatus {
73
89
u .mutex .Lock ()
74
90
defer u .mutex .Unlock ()
91
+ u .fromTmpToMap ()
75
92
return u .extract (id , errorCode , false )
76
93
}
77
94
@@ -101,6 +118,7 @@ func (u *unConfirmed) updateStatus(rootMessage *ConfirmationStatus, errorCode ui
101
118
func (u * unConfirmed ) extractWithTimeOut (timeout time.Duration ) []* ConfirmationStatus {
102
119
u .mutex .Lock ()
103
120
defer u .mutex .Unlock ()
121
+ u .fromTmpToMap ()
104
122
var res []* ConfirmationStatus
105
123
for _ , v := range u .messages {
106
124
if time .Since (v .inserted ) > timeout {
@@ -114,11 +132,13 @@ func (u *unConfirmed) extractWithTimeOut(timeout time.Duration) []*ConfirmationS
114
132
func (u * unConfirmed ) size () int {
115
133
u .mutex .Lock ()
116
134
defer u .mutex .Unlock ()
135
+ u .fromTmpToMap ()
117
136
return len (u .messages )
118
137
}
119
138
120
139
func (u * unConfirmed ) getAll () map [int64 ]* ConfirmationStatus {
121
140
u .mutex .Lock ()
122
141
defer u .mutex .Unlock ()
142
+ u .fromTmpToMap ()
123
143
return u .messages
124
144
}
0 commit comments