mirror of
https://github.com/yusing/godoxy.git
synced 2026-02-17 16:07:44 +01:00
feat(proxmox): add session refresh loop to maintain Proxmox API session
Introduced a new session refresh mechanism in the Proxmox configuration to ensure the API session remains active. This includes: - Added `SessionRefreshInterval` constant for configurable session refresh timing. - Implemented `refreshSessionLoop` method to periodically refresh the session and handle errors with exponential backoff. This enhancement improves the reliability of interactions with the Proxmox API by preventing session expiry.
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"errors"
|
||||
"math"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -31,6 +32,7 @@ type Config struct {
|
||||
}
|
||||
|
||||
const ResourcePollInterval = 3 * time.Second
|
||||
const SessionRefreshInterval = 1 * time.Minute
|
||||
|
||||
// NodeStatsPollInterval controls how often node stats are streamed when streaming is enabled.
|
||||
const NodeStatsPollInterval = time.Second
|
||||
@@ -106,6 +108,7 @@ func (c *Config) Init(ctx context.Context) gperr.Error {
|
||||
}
|
||||
|
||||
go c.updateResourcesLoop(ctx)
|
||||
go c.refreshSessionLoop(ctx)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -130,3 +133,33 @@ func (c *Config) updateResourcesLoop(ctx context.Context) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Config) refreshSessionLoop(ctx context.Context) {
|
||||
ticker := time.NewTicker(SessionRefreshInterval)
|
||||
defer ticker.Stop()
|
||||
|
||||
log.Trace().Str("cluster", c.client.Cluster.Name).Msg("[proxmox] starting session refresh loop")
|
||||
|
||||
numRetries := 0
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
log.Trace().Str("cluster", c.client.Cluster.Name).Msg("[proxmox] stopping session refresh loop")
|
||||
return
|
||||
case <-ticker.C:
|
||||
reqCtx, reqCtxCancel := context.WithTimeout(ctx, SessionRefreshInterval)
|
||||
err := c.client.RefreshSession(reqCtx)
|
||||
reqCtxCancel()
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("cluster", c.client.Cluster.Name).Msg("[proxmox] failed to refresh session")
|
||||
// exponential backoff
|
||||
numRetries++
|
||||
backoff := time.Duration(min(math.Pow(2, float64(numRetries)), 10)) * time.Second
|
||||
ticker.Reset(backoff)
|
||||
} else {
|
||||
ticker.Reset(SessionRefreshInterval)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user