Skip to content

Commit 1f9f12c

Browse files
committed
feat: sleep 10ms for epoll wait
1 parent 11edf6b commit 1f9f12c

File tree

6 files changed

+23
-118
lines changed

6 files changed

+23
-118
lines changed

connstate/conn_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func TestListenConnState(t *testing.T) {
5454
buf := make([]byte, 1)
5555
_, err = conn.Read(buf)
5656
assert.Equal(t, io.EOF, err)
57-
time.Sleep(10 * time.Millisecond)
57+
time.Sleep(100 * time.Millisecond)
5858
assert.Equal(t, StateRemoteClosed, stater.State())
5959
assert.Nil(t, stater.Close())
6060
assert.Nil(t, conn.Close())
@@ -190,7 +190,7 @@ func BenchmarkListenConnState(b *testing.B) {
190190
buf := make([]byte, 1)
191191
_, err = conn.Read(buf)
192192
assert.Equal(b, io.EOF, err)
193-
time.Sleep(10 * time.Millisecond)
193+
time.Sleep(100 * time.Millisecond)
194194
assert.Equal(b, StateRemoteClosed, stater.State())
195195
assert.Nil(b, stater.Close())
196196
assert.Nil(b, conn.Close())

connstate/poll_bsd.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package connstate
2020
import (
2121
"sync/atomic"
2222
"syscall"
23+
"time"
2324
"unsafe"
2425
)
2526

@@ -29,15 +30,24 @@ type kqueue struct {
2930

3031
func (p *kqueue) wait() error {
3132
events := make([]syscall.Kevent_t, 1024)
33+
timeout := &syscall.Timespec{Sec: 0, Nsec: 0}
34+
var n int
35+
var err error
3236
for {
33-
n, err := syscall.Kevent(p.fd, nil, events, nil)
37+
// timeout=0 must be set to avoid getting stuck in a blocking syscall,
38+
// which could cause a P to fail to be released in a timely manner.
39+
n, err = syscall.Kevent(p.fd, nil, events, timeout)
3440
if err != nil && err != syscall.EINTR {
3541
// exit gracefully
3642
if err == syscall.EBADF {
3743
return nil
3844
}
3945
return err
4046
}
47+
if n <= 0 {
48+
time.Sleep(10 * time.Millisecond) // avoid busy loop
49+
continue
50+
}
4151
for i := 0; i < n; i++ {
4252
ev := &events[i]
4353
op := *(**fdOperator)(unsafe.Pointer(&ev.Udata))

connstate/poll_linux.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ package connstate
1717
import (
1818
"sync/atomic"
1919
"syscall"
20+
"time"
2021
"unsafe"
21-
22-
isyscall "github.com/cloudwego/gopkg/internal/syscall"
2322
)
2423

2524
const _EPOLLET uint32 = 0x80000000
@@ -31,13 +30,19 @@ type epoller struct {
3130
//go:nocheckptr
3231
func (p *epoller) wait() error {
3332
events := make([]syscall.EpollEvent, 1024)
33+
var n int
34+
var err error
3435
for {
35-
// epoll wait is a blocking syscall, so we need to call entersyscallblock to handoff P,
36-
// and let the P run other goroutines.
37-
n, err := isyscall.EpollWait(p.epfd, events, -1)
36+
// timeout=0 must be set to avoid getting stuck in a blocking syscall,
37+
// which could cause a P to fail to be released in a timely manner.
38+
n, err = syscall.EpollWait(p.epfd, events, 0)
3839
if err != nil && err != syscall.EINTR {
3940
return err
4041
}
42+
if n <= 0 {
43+
time.Sleep(10 * time.Millisecond) // avoid busy loop
44+
continue
45+
}
4146
for i := 0; i < n; i++ {
4247
ev := &events[i]
4348
op := *(**fdOperator)(unsafe.Pointer(&ev.Fd))

internal/syscall/sys_epoll_linux.go

Lines changed: 0 additions & 43 deletions
This file was deleted.

internal/syscall/sys_epoll_linux_arm64_.go

Lines changed: 0 additions & 44 deletions
This file was deleted.

internal/syscall/unsafe.go

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)