Skip to content

Commit d3ee8c8

Browse files
committed
"Add retry mechanisms for socket creation, address resolution, and gRPC server startup"
Signed-off-by: Osmany Montero <osmontero@icloud.com>
1 parent afd434e commit d3ee8c8

1 file changed

Lines changed: 100 additions & 23 deletions

File tree

plugins/soc-ai/main.go

Lines changed: 100 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"net"
66
"os"
7+
"time"
78

89
"github.com/threatwinds/go-sdk/catcher"
910
"github.com/threatwinds/go-sdk/plugins"
@@ -24,41 +25,117 @@ func main() {
2425

2526
go configurations.UpdateGPTConfigurations()
2627

27-
socketsFolder, err := twutil.MkdirJoin(plugins.WorkDir, "sockets")
28-
if err != nil {
29-
utils.Logger.ErrorF("cannot create socket directory: %v", err)
30-
_ = catcher.Error("cannot create socket directory", err, nil)
31-
os.Exit(1)
28+
// Retry logic for creating socket directory
29+
maxRetries := 3
30+
retryDelay := 2 * time.Second
31+
var socketsFolder twutil.Folder
32+
var err error
33+
34+
for retry := 0; retry < maxRetries; retry++ {
35+
socketsFolder, err = twutil.MkdirJoin(plugins.WorkDir, "sockets")
36+
if err == nil {
37+
utils.Logger.LogF(100, "Socket directory %s created", socketsFolder)
38+
break
39+
}
40+
41+
_ = catcher.Error("cannot create socket directory, retrying", err, map[string]any{
42+
"retry": retry + 1,
43+
"maxRetries": maxRetries,
44+
})
45+
46+
if retry < maxRetries-1 {
47+
time.Sleep(retryDelay)
48+
// Increase delay for next retry
49+
retryDelay *= 2
50+
} else {
51+
// If all retries failed, log the error and return
52+
_ = catcher.Error("all retries failed when creating socket directory", err, nil)
53+
return
54+
}
3255
}
33-
utils.Logger.LogF(100, "Socket directory %s created", socketsFolder)
3456

3557
socketFile := socketsFolder.FileJoin("com.utmstack.soc-ai_correlation.sock")
3658
_ = os.Remove(socketFile)
3759

38-
unixAddress, err := net.ResolveUnixAddr("unix", socketFile)
39-
if err != nil {
40-
utils.Logger.ErrorF("cannot resolve unix address: %v", err)
41-
_ = catcher.Error("cannot resolve unix address", err, nil)
42-
os.Exit(1)
60+
// Retry logic for resolving unix address
61+
retryDelay = 2 * time.Second
62+
var unixAddress *net.UnixAddr
63+
64+
for retry := 0; retry < maxRetries; retry++ {
65+
unixAddress, err = net.ResolveUnixAddr("unix", socketFile)
66+
if err == nil {
67+
utils.Logger.LogF(100, "Socket file %s created", socketFile)
68+
break
69+
}
70+
71+
_ = catcher.Error("cannot resolve unix address, retrying", err, map[string]any{
72+
"retry": retry + 1,
73+
"maxRetries": maxRetries,
74+
})
75+
76+
if retry < maxRetries-1 {
77+
time.Sleep(retryDelay)
78+
// Increase delay for next retry
79+
retryDelay *= 2
80+
} else {
81+
// If all retries failed, log the error and return
82+
_ = catcher.Error("all retries failed when resolving unix address", err, nil)
83+
return
84+
}
4385
}
44-
utils.Logger.LogF(100, "Socket file %s created", socketFile)
4586

46-
listener, err := net.ListenUnix("unix", unixAddress)
47-
if err != nil {
48-
utils.Logger.ErrorF("cannot listen to unix socket: %v", err)
49-
_ = catcher.Error("cannot listen to unix socket", err, nil)
50-
os.Exit(1)
87+
// Retry logic for listening to unix socket
88+
retryDelay = 2 * time.Second
89+
var listener *net.UnixListener
90+
91+
for retry := 0; retry < maxRetries; retry++ {
92+
listener, err = net.ListenUnix("unix", unixAddress)
93+
if err == nil {
94+
utils.Logger.LogF(100, "Listening on %s", socketFile)
95+
break
96+
}
97+
98+
_ = catcher.Error("cannot listen to unix socket, retrying", err, map[string]any{
99+
"retry": retry + 1,
100+
"maxRetries": maxRetries,
101+
})
102+
103+
if retry < maxRetries-1 {
104+
time.Sleep(retryDelay)
105+
// Increase delay for next retry
106+
retryDelay *= 2
107+
} else {
108+
// If all retries failed, log the error and return
109+
_ = catcher.Error("all retries failed when listening to unix socket", err, nil)
110+
return
111+
}
51112
}
52-
utils.Logger.LogF(100, "Listening on %s", socketFile)
53113

54114
grpcServer := grpc.NewServer()
55115
plugins.RegisterCorrelationServer(grpcServer, &socAiServer{})
56116

57-
utils.Logger.LogF(100, "Server started successfully")
58-
if err := grpcServer.Serve(listener); err != nil {
59-
utils.Logger.ErrorF("cannot serve grpc: %v", err)
60-
_ = catcher.Error("cannot serve grpc", err, nil)
61-
os.Exit(1)
117+
// Serve with error handling and retry logic
118+
retryDelay = 2 * time.Second
119+
for retry := 0; retry < maxRetries; retry++ {
120+
err := grpcServer.Serve(listener)
121+
if err == nil {
122+
break
123+
}
124+
125+
_ = catcher.Error("cannot serve grpc, retrying", err, map[string]any{
126+
"retry": retry + 1,
127+
"maxRetries": maxRetries,
128+
})
129+
130+
if retry < maxRetries-1 {
131+
time.Sleep(retryDelay)
132+
// Increase delay for next retry
133+
retryDelay *= 2
134+
} else {
135+
// If all retries failed, log the error and return
136+
_ = catcher.Error("all retries failed when listening to unix socket", err, nil)
137+
return
138+
}
62139
}
63140
}
64141

0 commit comments

Comments
 (0)