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 (
|
var (
|
||||||
RawSyscallNoError = rawSyscallNoError
|
RawSyscallNoError = rawSyscallNoError
|
||||||
ForceClone3 = &forceClone3
|
ForceClone3 = &forceClone3
|
||||||
|
Prlimit = prlimit
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,12 @@
|
||||||
|
|
||||||
package syscall
|
package syscall
|
||||||
|
|
||||||
|
import "sync/atomic"
|
||||||
|
|
||||||
func OrigRlimitNofile() *Rlimit {
|
func OrigRlimitNofile() *Rlimit {
|
||||||
return origRlimitNofile.Load()
|
return origRlimitNofile.Load()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetInternalOrigRlimitNofile() *atomic.Pointer[Rlimit] {
|
||||||
|
return &origRlimitNofile
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -654,3 +654,69 @@ func TestAllThreadsSyscallBlockedSyscall(t *testing.T) {
|
||||||
wr.Close()
|
wr.Close()
|
||||||
wg.Wait()
|
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