mirror of https://github.com/golang/go.git
add tests for prlimit
Signed-off-by: lifubang <lifubang@acmcoder.com>
This commit is contained in:
parent
4ce20f3496
commit
5eabc760be
|
|
@ -11,6 +11,7 @@ import (
|
|||
var (
|
||||
RawSyscallNoError = rawSyscallNoError
|
||||
ForceClone3 = &forceClone3
|
||||
Prlimit = prlimit
|
||||
)
|
||||
|
||||
const (
|
||||
|
|
|
|||
|
|
@ -6,6 +6,12 @@
|
|||
|
||||
package syscall
|
||||
|
||||
import "sync/atomic"
|
||||
|
||||
func OrigRlimitNofile() *Rlimit {
|
||||
return origRlimitNofile.Load()
|
||||
}
|
||||
|
||||
func GetInternalOrigRlimitNofile() *atomic.Pointer[Rlimit] {
|
||||
return &origRlimitNofile
|
||||
}
|
||||
|
|
|
|||
|
|
@ -654,3 +654,69 @@ func TestAllThreadsSyscallBlockedSyscall(t *testing.T) {
|
|||
wr.Close()
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func TestPrlimitSelf(t *testing.T) {
|
||||
origLimit := syscall.OrigRlimitNofile()
|
||||
origRlimitNofile := syscall.GetInternalOrigRlimitNofile()
|
||||
|
||||
if origLimit == nil {
|
||||
defer origRlimitNofile.Store(origLimit)
|
||||
origRlimitNofile.Store(&syscall.Rlimit{
|
||||
Cur: 1024,
|
||||
Max: 65536,
|
||||
})
|
||||
}
|
||||
|
||||
// Get current process's nofile limit
|
||||
var lim syscall.Rlimit
|
||||
if err := syscall.Prlimit(0, syscall.RLIMIT_NOFILE, nil, &lim); err != nil {
|
||||
t.Fatalf("Failed to get the current nofile limit: %v", err)
|
||||
}
|
||||
// Set current process's nofile limit through prlimit
|
||||
if err := syscall.Prlimit(0, syscall.RLIMIT_NOFILE, &lim, nil); err != nil {
|
||||
t.Fatalf("Prlimit self failed: %v", err)
|
||||
}
|
||||
|
||||
rlimLater := origRlimitNofile.Load()
|
||||
if rlimLater != nil {
|
||||
t.Fatalf("origRlimitNofile got=%v, want=nil", rlimLater)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPrlimitOtherProcess(t *testing.T) {
|
||||
origLimit := syscall.OrigRlimitNofile()
|
||||
origRlimitNofile := syscall.GetInternalOrigRlimitNofile()
|
||||
|
||||
if origLimit == nil {
|
||||
defer origRlimitNofile.Store(origLimit)
|
||||
origRlimitNofile.Store(&syscall.Rlimit{
|
||||
Cur: 1024,
|
||||
Max: 65536,
|
||||
})
|
||||
}
|
||||
rlimOrig := origRlimitNofile.Load()
|
||||
|
||||
// Start a child process firstly,
|
||||
// so we can use Prlimit to set it's nofile limit.
|
||||
cmd := exec.Command("sleep", "infinity")
|
||||
cmd.Start()
|
||||
defer func() {
|
||||
cmd.Process.Kill()
|
||||
cmd.Process.Wait()
|
||||
}()
|
||||
|
||||
// Get child process's current nofile limit
|
||||
var lim syscall.Rlimit
|
||||
if err := syscall.Prlimit(cmd.Process.Pid, syscall.RLIMIT_NOFILE, nil, &lim); err != nil {
|
||||
t.Fatalf("Failed to get the current nofile limit: %v", err)
|
||||
}
|
||||
// Set child process's nofile rlimit through prlimit
|
||||
if err := syscall.Prlimit(cmd.Process.Pid, syscall.RLIMIT_NOFILE, &lim, nil); err != nil {
|
||||
t.Fatalf("Prlimit(%d) failed: %v", cmd.Process.Pid, err)
|
||||
}
|
||||
|
||||
rlimLater := origRlimitNofile.Load()
|
||||
if rlimLater != rlimOrig {
|
||||
t.Fatalf("origRlimitNofile got=%v, want=%v", rlimLater, rlimOrig)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue