Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
5fcd39c
PMM-15129 Fix noctx Go linter issues
maxkondr Jul 8, 2026
7df66d5
fix
maxkondr Jul 9, 2026
3fd0ed2
fix
maxkondr Jul 9, 2026
da44e48
Potential fix for pull request finding
maxkondr Jul 9, 2026
1782f52
Potential fix for pull request finding
maxkondr Jul 9, 2026
e029841
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
maxkondr Jul 9, 2026
687ce65
Potential fix for pull request finding
maxkondr Jul 9, 2026
977b87e
fix
maxkondr Jul 9, 2026
336fc06
fix
maxkondr Jul 9, 2026
d4e1486
Potential fix for pull request finding
maxkondr Jul 9, 2026
b133933
Potential fix for pull request finding
maxkondr Jul 9, 2026
8e41dbf
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 10, 2026
a733f6a
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 10, 2026
da22d13
update
maxkondr Jul 10, 2026
5368cc1
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
maxkondr Jul 10, 2026
78a5442
Potential fix for pull request finding
maxkondr Jul 10, 2026
6ba40c0
fix
maxkondr Jul 10, 2026
3461f68
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
maxkondr Jul 13, 2026
f19a5cb
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 13, 2026
15fee54
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 13, 2026
8562395
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 13, 2026
19af1bf
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 13, 2026
31d0413
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 13, 2026
f5019d1
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 13, 2026
6f6b9ed
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 13, 2026
241e239
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 14, 2026
bb0d037
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 14, 2026
a049c4c
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 14, 2026
589feb5
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 14, 2026
1583d19
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 14, 2026
53dafb2
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 14, 2026
0d8af96
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 15, 2026
fc20fa1
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 15, 2026
c6af872
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 15, 2026
667e53c
Merge branch 'main' into PMM-15129-fix-go-linter-noctx
pmm-prbot[bot] Jul 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ linters:
- lll # tests often require long lines
- maintidx # not critical for tests
- mnd # tests are full of magic numbers
- noctx # not critical for tests
- nonamedreturns # not critical for tests, albeit desirable
- testpackage # senseless
- unused # very annoying false positive: https://github.com/golangci/golangci-lint/issues/791
Expand Down
7 changes: 4 additions & 3 deletions admin/commands/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package commands

import (
"context"
"fmt"
"os/exec"
"strings"
Expand Down Expand Up @@ -144,10 +145,10 @@ func (cmd *ConfigCommand) args(globals *flags.GlobalFlags) ([]string, bool) {
return res, switchedToTLS
}

// RunCmd runs config command.
func (cmd *ConfigCommand) RunCmd(globals *flags.GlobalFlags) (Result, error) {
// RunCmdWithContext runs config command.
func (cmd *ConfigCommand) RunCmdWithContext(ctx context.Context, globals *flags.GlobalFlags) (Result, error) {
args, switchedToTLS := cmd.args(globals)
c := exec.Command("pmm-agent", args...) //nolint:gosec
c := exec.CommandContext(ctx, "pmm-agent", args...) //nolint:gosec
logrus.Debugf("Running: %s", strings.Join(c.Args, " "))
b, err := c.Output() // hide pmm-agent's stderr logging
res := &configResult{
Expand Down
2 changes: 1 addition & 1 deletion admin/commands/summary.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ func addClientData(ctx context.Context, zipW *zip.Writer) {

// FIXME get it via pmm-agent's API - it is _not_ a good idea to use exec there
// golangci-lint should continue complain about it until it is fixed
b, err = exec.Command("pmm-agent", "--version").CombinedOutput()
b, err = exec.CommandContext(ctx, "pmm-agent", "--version").CombinedOutput()
if err != nil {
logrus.Debugf("%s", err)
b = []byte(err.Error())
Expand Down
3 changes: 2 additions & 1 deletion agent/agentlocal/agent_local.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,8 @@ func (s *Server) Run(ctx context.Context, reloadCh chan bool) {

// Get random free port for gRPC server.
// If we can't get one, panic since everything is seriously broken.
l, err := net.Listen("tcp", "127.0.0.1:0")
lc := net.ListenConfig{}
l, err := lc.Listen(ctx, "tcp", "127.0.0.1:0")
if err != nil {
s.l.Panic(err)
}
Expand Down
5 changes: 4 additions & 1 deletion agent/agents/process/process.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,10 @@ func (p *Process) toStarting() {
p.l.Tracef("Process: starting.")
p.changes <- inventoryv1.AgentStatus_AGENT_STATUS_STARTING

p.cmd = exec.Command(p.params.Path, p.params.Args...) //nolint:gosec
// Do not pass context to exec.Command,
// because it will kill the process when context is canceled,
// but we want to gracefully stop it manually.
Comment thread
maxkondr marked this conversation as resolved.
p.cmd = exec.Command(p.params.Path, p.params.Args...) //nolint:gosec,noctx
p.cmd.Stdout = p.pl
p.cmd.Stderr = p.pl

Expand Down
29 changes: 19 additions & 10 deletions agent/agents/supervisor/ports_registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package supervisor

import (
"context"
"errors"
"fmt"
"net"
Expand Down Expand Up @@ -57,7 +58,7 @@ func newPortsRegistry(minPort, maxPort uint16, reserved []uint16) *portsRegistry
// Reserve reserves next free port.
// It tries to reuse ports as little as possible to avoid erroneous Prometheus scrapes
// to the different exporter type when Prometheus configuration is being reloaded.
func (r *portsRegistry) Reserve() (uint16, error) {
func (r *portsRegistry) Reserve(ctx context.Context) (uint16, error) {
r.m.Lock()
defer r.m.Unlock()

Comment thread
Copilot marked this conversation as resolved.
Outdated
Expand All @@ -68,13 +69,17 @@ func (r *portsRegistry) Reserve() (uint16, error) {
continue
}

l, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", port))
if l != nil {
_ = l.Close()
}
lc := net.ListenConfig{}
l, err := lc.Listen(ctx, "tcp", fmt.Sprintf("127.0.0.1:%d", port))
if err != nil {
if ctx.Err() != nil {
return 0, ctx.Err()
}
continue
}
if l != nil {
_ = l.Close()
}

r.reserved[port] = struct{}{}
r.last = port
Expand All @@ -85,21 +90,25 @@ func (r *portsRegistry) Reserve() (uint16, error) {
}

// Release releases port.
func (r *portsRegistry) Release(port uint16) error {
func (r *portsRegistry) Release(ctx context.Context, port uint16) error {
r.m.Lock()
defer r.m.Unlock()

Comment thread
maxkondr marked this conversation as resolved.
Outdated
if _, ok := r.reserved[port]; !ok {
return errPortNotReserved
}

l, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", port))
if l != nil {
_ = l.Close()
}
lc := net.ListenConfig{}
l, err := lc.Listen(ctx, "tcp", fmt.Sprintf("127.0.0.1:%d", port))
if err != nil {
if ctx.Err() != nil {
return ctx.Err()
}
return errPortBusy
}
if l != nil {
_ = l.Close()
}

delete(r.reserved, port)
return nil
Expand Down
40 changes: 20 additions & 20 deletions agent/agents/supervisor/ports_registry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ func TestRegistry(t *testing.T) {
_ = l1.Close()
})

p, err := r.Reserve()
p, err := r.Reserve(t.Context())
require.NoError(t, err)
assert.EqualValues(t, 65002, p)
_, err = r.Reserve()
_, err = r.Reserve(t.Context())
assert.Equal(t, errNoFreePort, err)

l2, err := net.Listen("tcp", "127.0.0.1:65002")
Expand All @@ -43,72 +43,72 @@ func TestRegistry(t *testing.T) {
_ = l2.Close()
})

err = r.Release(65000)
err = r.Release(t.Context(), 65000)
require.NoError(t, err)
err = r.Release(65001)
err = r.Release(t.Context(), 65001)
assert.Equal(t, errPortNotReserved, err)
err = r.Release(65002)
err = r.Release(t.Context(), 65002)
assert.Equal(t, errPortBusy, err)

require.NoError(t, l1.Close())
require.NoError(t, l2.Close())

p, err = r.Reserve()
p, err = r.Reserve(t.Context())
require.NoError(t, err)
assert.EqualValues(t, 65000, p)
p, err = r.Reserve()
p, err = r.Reserve(t.Context())
require.NoError(t, err)
assert.EqualValues(t, 65001, p)
_, err = r.Reserve()
_, err = r.Reserve(t.Context())
assert.Equal(t, errNoFreePort, err)

err = r.Release(65002)
err = r.Release(t.Context(), 65002)
require.NoError(t, err)

p, err = r.Reserve()
p, err = r.Reserve(t.Context())
require.NoError(t, err)
assert.EqualValues(t, 65002, p)
_, err = r.Reserve()
_, err = r.Reserve(t.Context())
assert.Equal(t, errNoFreePort, err)
}

func TestPreferNewPort(t *testing.T) {
r := newPortsRegistry(65000, 65002, nil)

p, err := r.Reserve()
p, err := r.Reserve(t.Context())
require.NoError(t, err)
assert.EqualValues(t, 65000, p)

err = r.Release(p)
err = r.Release(t.Context(), p)
require.NoError(t, err)

p, err = r.Reserve()
p, err = r.Reserve(t.Context())
require.NoError(t, err)
assert.EqualValues(t, 65001, p)

p, err = r.Reserve()
p, err = r.Reserve(t.Context())
require.NoError(t, err)
assert.EqualValues(t, 65002, p)

p, err = r.Reserve()
p, err = r.Reserve(t.Context())
require.NoError(t, err)
assert.EqualValues(t, 65000, p)
}

func TestSinglePort(t *testing.T) {
r := newPortsRegistry(65000, 65000, nil)

p, err := r.Reserve()
p, err := r.Reserve(t.Context())
require.NoError(t, err)
assert.EqualValues(t, 65000, p)

_, err = r.Reserve()
_, err = r.Reserve(t.Context())
assert.Equal(t, errNoFreePort, err)

err = r.Release(p)
err = r.Release(t.Context(), p)
require.NoError(t, err)

p, err = r.Reserve()
p, err = r.Reserve(t.Context())
require.NoError(t, err)
assert.EqualValues(t, 65000, p)
}
4 changes: 2 additions & 2 deletions agent/agents/supervisor/supervisor.go
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ func (s *Supervisor) setAgentProcesses(agentProcesses map[string]*agentv1.SetSta
agent.cancel()
<-agent.done

err := s.portsRegistry.Release(agent.listenPort)
err := s.portsRegistry.Release(s.ctx, agent.listenPort)
if err != nil {
s.l.Errorf("Failed to release port: %s.", err)
}
Expand Down Expand Up @@ -453,7 +453,7 @@ func (s *Supervisor) tryStartProcess(agentID string, agentProcess *agentv1.SetSt
var err error
for range processRetryCount {
if port == 0 {
_port, err := s.portsRegistry.Reserve()
_port, err := s.portsRegistry.Reserve(s.ctx)
if err != nil {
s.l.Errorf("Failed to reserve port: %s.", err)
continue
Expand Down
18 changes: 12 additions & 6 deletions agent/cmd/pmm-agent-entrypoint/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ func runPmmAgent(ctx context.Context, commandLineArgs []string, restartPolicy re
}
var exitCode int
l.Infof("Starting 'pmm-agent %s'...", strings.Join(commandLineArgs, " "))
cmd := commandPmmAgent(commandLineArgs)
cmd := commandPmmAgent(ctx, commandLineArgs)
err := cmd.Start()
if err != nil {
l.Errorf("Can't run: '%s', Error: %s", commandLineArgs, err)
Expand Down Expand Up @@ -111,9 +111,9 @@ func runPmmAgent(ctx context.Context, commandLineArgs []string, restartPolicy re
}
}

func commandPmmAgent(args []string) *exec.Cmd {
func commandPmmAgent(ctx context.Context, args []string) *exec.Cmd {
const pmmAgentCommandName = "pmm-agent"
command := exec.Command(pmmAgentCommandName, args...)
command := exec.CommandContext(ctx, pmmAgentCommandName, args...) //nolint:gosec
Comment thread
maxkondr marked this conversation as resolved.
command.Stdout = os.Stdout
command.Stderr = os.Stderr
return command
Expand Down Expand Up @@ -173,7 +173,13 @@ func main() { //nolint:gocognit

if len(os.Args) > 1 {
l.Info(helpText)
exec.CommandContext(ctx, "pmm-agent", "setup", "--help")
cmd := exec.CommandContext(ctx, "pmm-agent", "setup", "--help")
b, err := cmd.CombinedOutput()
Comment thread
maxkondr marked this conversation as resolved.
Outdated
if err != nil {
l.Errorf("Failed to run 'pmm-agent setup --help': %s", err)
os.Exit(1)
}
l.Info(string(b))
os.Exit(1)
Comment thread
maxkondr marked this conversation as resolved.
}

Expand All @@ -189,7 +195,7 @@ func main() { //nolint:gocognit
if *pmmAgentSidecar {
restartPolicy = restartOnFail
l.Info("Starting pmm-agent for liveness probe...")
agent = commandPmmAgent([]string{"run"})
agent = commandPmmAgent(ctx, []string{"run"})
err := agent.Start()
if err != nil {
l.Fatalf("Can't run pmm-agent: %s", err)
Expand All @@ -211,7 +217,7 @@ func main() { //nolint:gocognit
status = 0
if *pmmAgentPrerunFile != "" || *pmmAgentPrerunScript != "" { //nolint:nestif
l.Info("Starting pmm-agent for prerun...")
agent := commandPmmAgent([]string{"run"})
agent := commandPmmAgent(ctx, []string{"run"})
err := agent.Start()
if err != nil {
l.Errorf("Failed to run pmm-agent run command: %s", err)
Expand Down
2 changes: 1 addition & 1 deletion agent/utils/tests/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func waitForTestDataLoad(tb testing.TB, db *sql.DB) {
var count int
var err error
for range 30 {
err = db.QueryRow("SELECT /* pmm-agent-tests:waitForTestDataLoad */ COUNT(*) FROM city").Scan(&count) //nolint:noctx
err = db.QueryRowContext(tb.Context(), "SELECT /* pmm-agent-tests:waitForTestDataLoad */ COUNT(*) FROM city").Scan(&count)
if err == nil {
return
}
Expand Down
2 changes: 1 addition & 1 deletion agent/utils/tests/mysql.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func OpenTestMySQL(tb testing.TB) *sql.DB {
waitForTestDataLoad(tb, db)

// to make Actions tests more stable
_, err = db.Exec(`ANALYZE /* pmm-agent-tests:OpenTestMySQL */ TABLE city`)
_, err = db.ExecContext(tb.Context(), `ANALYZE /* pmm-agent-tests:OpenTestMySQL */ TABLE city`)
require.NoError(tb, err)

return db
Expand Down
2 changes: 1 addition & 1 deletion agent/utils/tests/postgresql.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ func PostgreSQLVersion(tb testing.TB, db *sql.DB) (string, string) {
tb.Helper()

var v string
err := db.QueryRow("SELECT /* pmm-agent-tests:PostgreSQLVersion */ version()").Scan(&v)
err := db.QueryRowContext(tb.Context(), "SELECT /* pmm-agent-tests:PostgreSQLVersion */ version()").Scan(&v)
require.NoError(tb, err)

major, minor := version.ParsePostgreSQLVersion(v)
Expand Down
3 changes: 2 additions & 1 deletion managed/cmd/pmm-managed/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,8 @@ func runGRPCServer(ctx context.Context, deps *gRPCServerDeps) {
go rtaStore.Run(ctx)

// run server until it is stopped gracefully or not
listener, err := net.Listen("tcp", gRPCAddr)
listenConfig := net.ListenConfig{}
listener, err := listenConfig.Listen(ctx, "tcp", gRPCAddr)
if err != nil {
l.Fatal(err)
}
Expand Down
1 change: 1 addition & 0 deletions managed/cmd/pmm-managed/packages.dot
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
digraph packages {
"/cmd/pmm-managed-init" -> "/models";
"/cmd/pmm-managed-init" -> "/services/clickhouse";
Comment thread
maxkondr marked this conversation as resolved.
Outdated
"/cmd/pmm-managed-init" -> "/services/supervisord";
"/cmd/pmm-managed-starlark" -> "/pi/check";
"/cmd/pmm-managed-starlark" -> "/pi/starlark";
Expand Down
Loading
Loading