-
Notifications
You must be signed in to change notification settings - Fork 37
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add a ProcessManager interface for managing processes by pid file #293
base: main
Are you sure you want to change the base?
Conversation
Reviewer's Guide by SourceryThis pull request introduces a Sequence diagram for finding and killing a processsequenceDiagram
participant P as Process
participant OS as Operating System
P->>P: Pid()
P->>OS: ReadFile(PidFilePath())
OS-->>P: pid (string)
P->>P: Atoi(pid)
P->>OS: FindProcess(pid)
OS-->>P: process, error
alt error != nil
P-->>P: Return error
else
P->>OS: Signal(SIGKILL)
OS-->>P: error
alt error != nil
P-->>P: Return error
else
P->>OS: Wait()
OS-->>P: _, error
alt error != nil
P-->>P: Return error
else
P-->>P: Return nil
end
end
end
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: The full list of commands accepted by this bot can be found here.
Needs approval from an approver in each of these files:
Approvers can indicate their approval by writing |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey @vyasgun - I've reviewed your changes - here's some feedback:
Overall Comments:
- Consider adding a
Close()
method to theProcessManager
interface to handle cleanup operations like removing the pid file. - The
New
function doesn't return an error, even though the signature allows it; consider removing the error return or adding a check.
Here's what I looked at during the review
- 🟡 General issues: 1 issue found
- 🟢 Security: all looks good
- 🟡 Testing: 2 issues found
- 🟢 Complexity: all looks good
- 🟢 Documentation: all looks good
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
112f790
to
4a6f13b
Compare
@sourcery-ai review |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey @vyasgun - I've reviewed your changes - here's some feedback:
Overall Comments:
- Consider adding a
Close()
method to theProcess
struct to handle cleaning up resources like the pid file. - The
Kill()
method should probably remove the pid file after successfully killing the process.
Here's what I looked at during the review
- 🟡 General issues: 3 issues found
- 🟢 Security: all looks good
- 🟡 Testing: 1 issue found
- 🟢 Complexity: all looks good
- 🟢 Documentation: all looks good
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
func New(name, pidFilePath string) (*Process, error) { | ||
return &Process{name: name, pidFilePath: pidFilePath}, nil |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: Reconsider New() returning an error.
Since the constructor never fails, it might be cleaner to have New() simply return *Process. If error checking is anticipated in future extensions, a brief comment explaining the design decision would be helpful.
Suggested implementation:
func New(name, pidFilePath string) *Process { // Currently always succeeds; change signature if error handling is needed in the future.
return &Process{name: name, pidFilePath: pidFilePath}
func (p *Process) Pid() (int, error) { | ||
data, err := os.ReadFile(p.PidFilePath()) | ||
if err != nil { | ||
return -1, err | ||
} | ||
pidStr := strings.TrimSpace(string(data)) | ||
pid, err := strconv.Atoi(pidStr) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: Wrap conversion error with more context.
While errors from strconv.Atoi are returned directly, adding contextual information (similar to the wrapping used elsewhere) could facilitate debugging if the PID file is malformed. This would improve consistency in error handling.
This commit does the following: - Adds ProcessManager interface and Process struct - Read and write to a pidFile specified by the user - Adds tests for process lifecycle with a dummy process
4a6f13b
to
adb05d0
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Have you tried using this to replace the equivalent code in crc, or possibly in podman? This would be the best way to make sure the interface is the one we need.
} | ||
pidStr := strings.TrimSpace(string(data)) | ||
pid, err := strconv.Atoi(pidStr) | ||
return pid, errors.Wrap(err, "invalid pid file") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
errors.Wrap
is deprecated, https://github.com/pkg/errors is archived. This has been superseded by https://go.dev/blog/go1.13-errors
if err != nil { | ||
return false | ||
} | ||
if err := proc.Signal(syscall.Signal(0)); err != nil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why syscall.Signal(0)
? Could this use one of the SIGXXX
constants from https://pkg.go.dev/syscall#pkg-constants ? (search for SIGABRT
)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it safe to call SIGABRT on the running process? On searching I found sending 0 is the safest way to check a process is running
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I mentioned SIGABRT
as a way to find the relevant section, I was not suggesting to use this signal :)
However, if FindProcess()
found it, I’d assume it means the process is running, no need to check again that it’s running ?
return true | ||
} | ||
|
||
func (p *Process) Kill() error { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We’ll probably want both Terminate
and Kill
as in kubernetes/minikube@10ea7ca (graceful shutdown vs forced shutdown)
But this can be added after it’s needed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll add Terminate
as well
return p.pidFilePath | ||
} | ||
|
||
func (p *Process) Pid() (int, error) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I’d name this ReadPidFile
, or PidFromFile
, as otherwise it’s easy to think it’s similar to https://pkg.go.dev/os#Getpid
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, noted.
return proc, nil | ||
} | ||
|
||
func (p *Process) Exists() bool { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Exists
in kubernetes/minikube@10ea7ca has an executable
argument, it’s because PIDs can be reused, and the content of the pid file can be staled, so this tries to ensure that the PID being killed is the expected process, and not some totally unrelated process which happened to be reusing the same PID.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay, I'll take that into account and modify the function
This commit does the following:
Summary by Sourcery
Implement a ProcessManager interface for managing processes using pid files
New Features:
Tests: