Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
9062b9fe
提交
9062b9fe
authored
1月 19, 2015
作者:
Juan Batiz-Benet
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
connect timing fixes to reuseport
上级
7a3e0cdc
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
31 行增加
和
16 行删除
+31
-16
Godeps.json
Godeps/Godeps.json
+1
-1
impl_unix.go
...workspace/src/github.com/jbenet/go-reuseport/impl_unix.go
+26
-11
interface.go
...workspace/src/github.com/jbenet/go-reuseport/interface.go
+4
-4
没有找到文件。
Godeps/Godeps.json
浏览文件 @
9062b9fe
...
@@ -160,7 +160,7 @@
...
@@ -160,7 +160,7 @@
},
},
{
{
"ImportPath"
:
"github.com/jbenet/go-reuseport"
,
"ImportPath"
:
"github.com/jbenet/go-reuseport"
,
"Rev"
:
"
f2ab96a83e1b33b66478eedd314884755d771933
"
"Rev"
:
"
1e1968c4744fef51234e83f015aa0187b4bd796b
"
},
},
{
{
"ImportPath"
:
"github.com/jbenet/go-sockaddr/net"
,
"ImportPath"
:
"github.com/jbenet/go-sockaddr/net"
,
...
...
Godeps/_workspace/src/github.com/jbenet/go-reuseport/impl_unix.go
浏览文件 @
9062b9fe
...
@@ -106,18 +106,27 @@ func dial(dialer net.Dialer, netw, addr string) (c net.Conn, err error) {
...
@@ -106,18 +106,27 @@ func dial(dialer net.Dialer, netw, addr string) (c net.Conn, err error) {
}
}
}
}
if
fd
,
err
=
socket
(
rfamily
,
socktype
,
rprotocol
);
err
!=
nil
{
// look at dialTCP in http://golang.org/src/net/tcpsock_posix.go .... !
return
nil
,
err
// here we just try again 3 times.
}
for
i
:=
0
;
i
<
3
;
i
++
{
if
fd
,
err
=
socket
(
rfamily
,
socktype
,
rprotocol
);
err
!=
nil
{
return
nil
,
err
}
if
err
=
syscall
.
Bind
(
fd
,
localSockaddr
);
err
!=
nil
{
if
err
=
syscall
.
Bind
(
fd
,
localSockaddr
);
err
!=
nil
{
// fmt.Println("bind failed")
// fmt.Println("bind failed")
syscall
.
Close
(
fd
)
syscall
.
Close
(
fd
)
return
nil
,
err
return
nil
,
err
}
if
err
=
connect
(
fd
,
remoteSockaddr
);
err
!=
nil
{
syscall
.
Close
(
fd
)
// fmt.Println("connect failed", localSockaddr, err)
continue
// try again.
}
break
}
}
if
err
=
connect
(
fd
,
remoteSockaddr
);
err
!=
nil
{
if
err
!=
nil
{
syscall
.
Close
(
fd
)
// fmt.Println("connect failed", localSockaddr, err)
return
nil
,
err
return
nil
,
err
}
}
...
@@ -314,6 +323,7 @@ func connect(fd int, ra syscall.Sockaddr) error {
...
@@ -314,6 +323,7 @@ func connect(fd int, ra syscall.Sockaddr) error {
}
}
var
err
error
var
err
error
start
:=
time
.
Now
()
for
{
for
{
// if err := fd.pd.WaitWrite(); err != nil {
// if err := fd.pd.WaitWrite(); err != nil {
// return err
// return err
...
@@ -321,7 +331,8 @@ func connect(fd int, ra syscall.Sockaddr) error {
...
@@ -321,7 +331,8 @@ func connect(fd int, ra syscall.Sockaddr) error {
// i'd use the above fd.pd.WaitWrite to poll io correctly, just like net sockets...
// i'd use the above fd.pd.WaitWrite to poll io correctly, just like net sockets...
// but of course, it uses fucking runtime_* functions that _cannot_ be used by
// but of course, it uses fucking runtime_* functions that _cannot_ be used by
// non-go-stdlib source... seriously guys, what kind of bullshit is that!?
// non-go-stdlib source... seriously guys, what kind of bullshit is that!?
<-
time
.
After
(
20
*
time
.
Microsecond
)
// we're relegated to using syscall.Select (what nightmare that is) or using
// a simple but totally bogus time-based wait. garbage.
var
nerr
int
var
nerr
int
nerr
,
err
=
syscall
.
GetsockoptInt
(
fd
,
syscall
.
SOL_SOCKET
,
syscall
.
SO_ERROR
)
nerr
,
err
=
syscall
.
GetsockoptInt
(
fd
,
syscall
.
SOL_SOCKET
,
syscall
.
SO_ERROR
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -329,6 +340,10 @@ func connect(fd int, ra syscall.Sockaddr) error {
...
@@ -329,6 +340,10 @@ func connect(fd int, ra syscall.Sockaddr) error {
}
}
switch
err
=
syscall
.
Errno
(
nerr
);
err
{
switch
err
=
syscall
.
Errno
(
nerr
);
err
{
case
syscall
.
EINPROGRESS
,
syscall
.
EALREADY
,
syscall
.
EINTR
:
case
syscall
.
EINPROGRESS
,
syscall
.
EALREADY
,
syscall
.
EINTR
:
if
time
.
Now
()
.
Sub
(
start
)
>
time
.
Second
{
return
err
}
<-
time
.
After
(
20
*
time
.
Microsecond
)
case
syscall
.
Errno
(
0
),
syscall
.
EISCONN
:
case
syscall
.
Errno
(
0
),
syscall
.
EISCONN
:
return
nil
return
nil
default
:
default
:
...
...
Godeps/_workspace/src/github.com/jbenet/go-reuseport/interface.go
浏览文件 @
9062b9fe
...
@@ -71,16 +71,16 @@ type Dialer struct {
...
@@ -71,16 +71,16 @@ type Dialer struct {
// Returns a net.Conn created from a file discriptor for a socket
// Returns a net.Conn created from a file discriptor for a socket
// with SO_REUSEPORT and SO_REUSEADDR option set.
// with SO_REUSEPORT and SO_REUSEADDR option set.
func
(
d
*
Dialer
)
Dial
(
network
,
address
string
)
(
net
.
Conn
,
error
)
{
func
(
d
*
Dialer
)
Dial
(
network
,
address
string
)
(
net
.
Conn
,
error
)
{
// there's a rare case where dial returns successfully but for some reason the
// RemoteAddr is not yet set. We wait here a while until it is, and if too long
// passes, we fail.
c
,
err
:=
dial
(
d
.
D
,
network
,
address
)
c
,
err
:=
dial
(
d
.
D
,
network
,
address
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
// there's a rare case where dial returns successfully but for some reason the
// RemoteAddr is not yet set. We wait here a while until it is, and if too long
// passes, we fail. This is horrendous.
for
start
:=
time
.
Now
();
c
.
RemoteAddr
()
==
nil
;
{
for
start
:=
time
.
Now
();
c
.
RemoteAddr
()
==
nil
;
{
if
time
.
Now
()
.
Sub
(
start
)
>
time
.
Second
{
if
time
.
Now
()
.
Sub
(
start
)
>
(
time
.
Millisecond
*
500
)
{
c
.
Close
()
c
.
Close
()
return
nil
,
ErrReuseFailed
return
nil
,
ErrReuseFailed
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论