NOISSUE - V-Sock reconnect for agent (#215)

* vsock reconnect

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* use backoff

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

---------

Signed-off-by: Sammy Oina <sammyoina@gmail.com>
This commit is contained in:
Sammy Kerata Oina
2024-08-30 16:29:39 +03:00
committed by GitHub
parent 742bba5f00
commit dc349e1f1f
+40 -1
View File
@@ -9,8 +9,10 @@ import (
"io"
"log"
"log/slog"
"time"
"github.com/absmach/magistrala/pkg/prometheus"
"github.com/cenkalti/backoff/v4"
"github.com/google/go-sev-guest/client"
"github.com/mdlayher/vsock"
"github.com/ultravioletrs/cocos/agent"
@@ -32,6 +34,7 @@ import (
const (
svcName = "agent"
defSvcGRPCPort = "7002"
retryInterval = 5 * time.Second
)
func main() {
@@ -43,7 +46,7 @@ func main() {
log.Fatalf("failed to read agent configuration from vsock %s", err.Error())
}
conn, err := vsock.Dial(vsock.Host, manager.ManagerVsockPort, nil)
conn, err := dialVsock()
if err != nil {
log.Fatal(err)
}
@@ -95,6 +98,22 @@ func main() {
gs := grpcserver.New(ctx, cancel, svcName, grpcServerConfig, registerAgentServiceServer, logger, qp, authSvc)
g.Go(func() error {
for {
if _, err := io.Copy(io.Discard, conn); err != nil {
log.Printf("vsock connection lost: %v, reconnecting...", err)
conn.Close()
conn, err = dialVsock()
if err != nil {
log.Fatal("failed to reconnect: ", err)
}
handler = agentlogger.NewProtoHandler(conn, &slog.HandlerOptions{Level: level})
logger = slog.New(handler)
}
time.Sleep(retryInterval)
}
})
g.Go(func() error {
return gs.Start()
})
@@ -158,3 +177,23 @@ func readConfig() (agent.Computation, error) {
}
return ac, nil
}
func dialVsock() (*vsock.Conn, error) {
var conn *vsock.Conn
var err error
err = backoff.Retry(func() error {
conn, err = vsock.Dial(vsock.Host, manager.ManagerVsockPort, nil)
if err == nil {
log.Println("vsock connection established")
return nil
}
log.Printf("vsock connection failed, retrying in %s... Error: %v", retryInterval, err)
return err
}, backoff.NewExponentialBackOff())
if err != nil {
return nil, err
}
return conn, nil
}