This commit is contained in:
@@ -3,6 +3,7 @@ package tasks
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"strconv"
|
||||
@@ -15,6 +16,17 @@ import (
|
||||
"github.com/jmoiron/sqlx"
|
||||
)
|
||||
|
||||
var snapshotProbeLimiter = make(chan struct{}, 1)
|
||||
|
||||
func acquireSnapshotProbe(ctx context.Context) (func(), error) {
|
||||
select {
|
||||
case snapshotProbeLimiter <- struct{}{}:
|
||||
return func() { <-snapshotProbeLimiter }, nil
|
||||
case <-ctx.Done():
|
||||
return nil, ctx.Err()
|
||||
}
|
||||
}
|
||||
|
||||
func boolStringFromInterface(value interface{}) string {
|
||||
switch v := value.(type) {
|
||||
case nil:
|
||||
@@ -98,30 +110,41 @@ LIMIT ?
|
||||
}
|
||||
if count.Valid && count.Int64 == 0 {
|
||||
if logger != nil {
|
||||
logger.Debug("skipping snapshot table with zero count", "table", name, "snapshot_time", ts)
|
||||
logger.Debug("skipping snapshot table with zero count", "table", name, "snapshot_time", ts, "vcenter", vcenter)
|
||||
}
|
||||
continue
|
||||
}
|
||||
probed := false
|
||||
var probeErr error
|
||||
probeTimeout := false
|
||||
// If count is known and >0, trust it; if NULL, accept optimistically to avoid heavy probes.
|
||||
hasRows := !count.Valid || count.Int64 > 0
|
||||
start := time.Now()
|
||||
if vcenter != "" && hasRows {
|
||||
probed = true
|
||||
vrows, qerr := querySnapshotRows(ctx, dbConn, name, []string{"VmId"}, `"Vcenter" = ? LIMIT 1`, vcenter)
|
||||
if qerr == nil {
|
||||
hasRows = vrows.Next()
|
||||
vrows.Close()
|
||||
} else {
|
||||
probeCtx, cancel := context.WithTimeout(ctx, 2*time.Second)
|
||||
release, err := acquireSnapshotProbe(probeCtx)
|
||||
if err != nil {
|
||||
probeErr = err
|
||||
hasRows = false
|
||||
if logger != nil {
|
||||
logger.Debug("snapshot vcenter filter probe failed", "table", name, "vcenter", vcenter, "error", qerr)
|
||||
cancel()
|
||||
} else {
|
||||
vrows, qerr := querySnapshotRows(probeCtx, dbConn, name, []string{"VmId"}, `"Vcenter" = ? LIMIT 1`, vcenter)
|
||||
if qerr == nil {
|
||||
hasRows = vrows.Next()
|
||||
vrows.Close()
|
||||
} else {
|
||||
probeErr = qerr
|
||||
hasRows = false
|
||||
}
|
||||
release()
|
||||
cancel()
|
||||
}
|
||||
probeTimeout = errors.Is(probeErr, context.DeadlineExceeded) || errors.Is(probeErr, context.Canceled)
|
||||
}
|
||||
elapsed := time.Since(start)
|
||||
if logger != nil {
|
||||
logger.Debug("evaluated snapshot table", "table", name, "snapshot_time", ts, "snapshot_count", count, "probed", probed, "has_rows", hasRows, "elapsed", elapsed)
|
||||
logger.Debug("evaluated snapshot table", "table", name, "snapshot_time", ts, "snapshot_count", count, "probed", probed, "has_rows", hasRows, "elapsed", elapsed, "vcenter", vcenter, "probe_error", probeErr, "probe_timeout", probeTimeout)
|
||||
}
|
||||
if !hasRows {
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user