1
1
package connections
2
2
3
3
import (
4
- "bytes"
5
4
"encoding/binary"
6
5
"fmt"
7
6
"log/slog"
@@ -16,86 +15,19 @@ import (
16
15
"github.com/google/uuid"
17
16
)
18
17
19
- var httpBytes = []byte ("HTTP" )
20
-
21
18
// Factory is a routine-safe container that holds a trackers with unique ID, and able to create new tracker.
22
19
type Factory struct {
23
- processor map [structs.ConnID ]chan interface {}
24
- connections map [structs.ConnID ]* Tracker
25
- mutex * sync.RWMutex
26
- trackersToDelete sync.Map
20
+ processor map [structs.ConnID ]chan interface {}
21
+ connections map [structs.ConnID ]* Tracker
22
+ mutex * sync.RWMutex
27
23
}
28
24
29
25
// NewFactory creates a new instance of the factory.
30
26
func NewFactory () * Factory {
31
- f := & Factory {
32
- processor : make (map [structs.ConnID ]chan interface {}),
33
- connections : make (map [structs.ConnID ]* Tracker ),
34
- mutex : & sync.RWMutex {},
35
- trackersToDelete : sync.Map {},
36
- }
37
-
38
- f .StartCleanupWorker ()
39
- return f
40
- }
41
-
42
- func (factory * Factory ) StartCleanupWorker () {
43
- go func () {
44
- for {
45
- time .Sleep (100 * time .Millisecond )
46
-
47
- now := time .Now ()
48
- factory .trackersToDelete .Range (func (key , value interface {}) bool {
49
- connID := key .(structs.ConnID )
50
- markedAt := value .(time.Time )
51
-
52
- if now .Sub (markedAt ) > time .Duration (trackerDataProcessInterval )* time .Millisecond {
53
- factory .ProcessAndStopWorker (connID )
54
- factory .forceDeleteWorker (connID )
55
- factory .trackersToDelete .Delete (connID )
56
- }
57
- return true
58
- })
59
- }
60
- }()
61
- }
62
-
63
- func (factory * Factory ) forceDeleteWorker (connectionID structs.ConnID ) {
64
- factory .mutex .Lock ()
65
- defer factory .mutex .Unlock ()
66
-
67
- if ch , exists := factory .processor [connectionID ]; exists {
68
- close (ch )
69
- delete (factory .processor , connectionID )
70
- slog .Debug ("Deleted event channel" , "fd" , connectionID .Fd , "id" , connectionID .Id , "timestamp" , connectionID .Conn_start_ns , "ip" , connectionID .Ip , "port" , connectionID .Port )
71
- }
72
-
73
- if _ , exists := factory .connections [connectionID ]; exists {
74
- delete (factory .connections , connectionID )
75
- slog .Debug ("Deleted connection" , "fd" , connectionID .Fd , "id" , connectionID .Id , "timestamp" , connectionID .Conn_start_ns , "ip" , connectionID .Ip , "port" , connectionID .Port )
76
- requestProcessCount ++
77
- }
78
-
79
- if (time .Now ().UnixMilli ())- lastMemCheck > int64 (memCheckInterval ) {
80
- lastMemCheck = time .Now ().UnixMilli ()
81
- mem := utils .LogMemoryStats ()
82
-
83
- utils .PrintLog ("Requests processed" , "count" , requestProcessCount , "lastMemCheck" , lastMemCheck )
84
- utils .PrintLog ("connection factory size" , "connections" , len (factory .connections ), "processors" , len (factory .processor ), "lastMemCheck" , lastMemCheck )
85
- requestProcessCount = 0
86
- if mem >= bufferMemThreshold {
87
- trackersToDelete := make (map [structs.ConnID ]struct {})
88
- for k := range factory .connections {
89
- trackersToDelete [k ] = struct {}{}
90
- }
91
- for key := range trackersToDelete {
92
- if ch , exists := factory .processor [key ]; exists {
93
- close (ch )
94
- delete (factory .processor , key )
95
- }
96
- delete (factory .connections , key )
97
- }
98
- }
27
+ return & Factory {
28
+ processor : make (map [structs.ConnID ]chan interface {}),
29
+ connections : make (map [structs.ConnID ]* Tracker ),
30
+ mutex : & sync.RWMutex {},
99
31
}
100
32
}
101
33
143
75
bufferMemThreshold = 400
144
76
145
77
// unique id of daemonset
146
- uniqueDaemonsetId = uuid .New ().String ()
147
- trackerDataProcessInterval = 100
78
+ uniqueDaemonsetId = uuid .New ().String ()
148
79
)
149
80
150
81
func init () {
@@ -153,7 +84,6 @@ func init() {
153
84
utils .InitVar ("TRAFFIC_INACTIVITY_THRESHOLD" , & inactivityThreshold )
154
85
utils .InitVar ("TRAFFIC_BUFFER_THRESHOLD" , & bufferMemThreshold )
155
86
utils .InitVar ("AKTO_MEM_SOFT_LIMIT" , & bufferMemThreshold )
156
- utils .InitVar ("TRACKER_DATA_PROCESS_INTERVAL" , & trackerDataProcessInterval )
157
87
}
158
88
159
89
func ProcessTrackerData (connID structs.ConnID , tracker * Tracker , isComplete bool ) {
@@ -185,14 +115,10 @@ func ProcessTrackerData(connID structs.ConnID, tracker *Tracker, isComplete bool
185
115
hostName = kafkaUtil .PodInformerInstance .GetPodNameByProcessId (int32 (connID .Id >> 32 ))
186
116
}
187
117
188
- if len (sentBuffer ) >= len (httpBytes ) && (bytes .Equal (sentBuffer [:len (httpBytes )], httpBytes )) {
189
- tryReadFromBD (destIpStr , srcIpStr , receiveBuffer , sentBuffer , isComplete , 1 , connID .Id , connID .Fd , uniqueDaemonsetId , hostName )
190
- }
118
+ tryReadFromBD (destIpStr , srcIpStr , receiveBuffer , sentBuffer , isComplete , 1 , connID .Id , connID .Fd , uniqueDaemonsetId , hostName )
191
119
if ! disableEgress {
192
120
// attempt to parse the egress as well by switching the recv and sent buffers.
193
- if len (receiveBuffer ) >= len (httpBytes ) && (bytes .Equal (receiveBuffer [:len (httpBytes )], httpBytes )) {
194
- tryReadFromBD (srcIpStr , destIpStr , sentBuffer , receiveBuffer , isComplete , 2 , connID .Id , connID .Fd , uniqueDaemonsetId , hostName )
195
- }
121
+ tryReadFromBD (srcIpStr , destIpStr , sentBuffer , receiveBuffer , isComplete , 2 , connID .Id , connID .Fd , uniqueDaemonsetId , hostName )
196
122
}
197
123
}
198
124
@@ -286,13 +212,16 @@ func (factory *Factory) StartWorker(connectionID structs.ConnID, tracker *Tracke
286
212
case * structs.SocketCloseEvent :
287
213
utils .LogProcessing ("Received close event" , "fd" , connID .Fd , "id" , connID .Id , "timestamp" , connID .Conn_start_ns , "ip" , connID .Ip , "port" , connID .Port )
288
214
tracker .AddCloseEvent (* e )
215
+ factory .ProcessAndStopWorker (connID )
289
216
factory .DeleteWorker (connID )
290
217
utils .LogProcessing ("Stopping go routine" , "fd" , connID .Fd , "id" , connID .Id , "timestamp" , connID .Conn_start_ns , "ip" , connID .Ip , "port" , connID .Port )
218
+ return
291
219
}
292
220
293
221
case <- inactivityTimer .C :
294
222
// Eat the go routine after inactive threshold, process the tracker and stop the worker
295
223
utils .LogProcessing ("Inactivity threshold reached, marking connection as inactive and processing" , "fd" , connID .Fd , "id" , connID .Id , "timestamp" , connID .Conn_start_ns , "ip" , connID .Ip , "port" , connID .Port )
224
+ factory .ProcessAndStopWorker (connID )
296
225
factory .DeleteWorker (connID )
297
226
utils .LogProcessing ("Stopping go routine" , "fd" , connID .Fd , "id" , connID .Id , "timestamp" , connID .Conn_start_ns , "ip" , connID .Ip , "port" , connID .Port )
298
227
return
@@ -312,7 +241,40 @@ func (factory *Factory) ProcessAndStopWorker(connectionID structs.ConnID) {
312
241
func (factory * Factory ) DeleteWorker (connectionID structs.ConnID ) {
313
242
factory .mutex .Lock ()
314
243
defer factory .mutex .Unlock ()
315
- factory .trackersToDelete .Store (connectionID , time .Now ())
244
+
245
+ if ch , exists := factory .processor [connectionID ]; exists {
246
+ close (ch )
247
+ delete (factory .processor , connectionID )
248
+ utils .LogProcessing ("Deleted event channel" , "fd" , connectionID .Fd , "id" , connectionID .Id , "timestamp" , connectionID .Conn_start_ns , "ip" , connectionID .Ip , "port" , connectionID .Port )
249
+ }
250
+
251
+ if _ , exists := factory .connections [connectionID ]; exists {
252
+ delete (factory .connections , connectionID )
253
+ utils .LogProcessing ("Deleted connection" , "fd" , connectionID .Fd , "id" , connectionID .Id , "timestamp" , connectionID .Conn_start_ns , "ip" , connectionID .Ip , "port" , connectionID .Port )
254
+ requestProcessCount ++
255
+ }
256
+
257
+ if (time .Now ().UnixMilli ())- lastMemCheck > int64 (memCheckInterval ) {
258
+ lastMemCheck = time .Now ().UnixMilli ()
259
+ mem := utils .LogMemoryStats ()
260
+ utils .PrintLog ("Requests processed" , "count" , requestProcessCount , "lastMemCheck" , lastMemCheck )
261
+ utils .PrintLog ("connection factory size" , "connections" , len (factory .connections ), "processors" , len (factory .processor ), "lastMemCheck" , lastMemCheck )
262
+ requestProcessCount = 0
263
+ if mem >= bufferMemThreshold {
264
+ trackersToDelete := make (map [structs.ConnID ]struct {})
265
+ utils .LogProcessing ("Deleting all trackers at mem" , "mem" , mem )
266
+ for k := range factory .connections {
267
+ trackersToDelete [k ] = struct {}{}
268
+ }
269
+ for key := range trackersToDelete {
270
+ if ch , exists := factory .processor [key ]; exists {
271
+ close (ch )
272
+ delete (factory .processor , key )
273
+ }
274
+ delete (factory .connections , key )
275
+ }
276
+ }
277
+ }
316
278
}
317
279
318
280
func (factory * Factory ) getChannel (connectionID structs.ConnID ) (chan interface {}, bool ) {
0 commit comments