Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
0e232e1d
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
0e232e1d
编写于
9月 16, 2016
作者:
I
igerasim
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8164147: Improve streaming socket output
Reviewed-by: chegar, igerasim
上级
c5df4fc8
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
91 addition
and
81 deletion
+91
-81
src/share/classes/java/net/SocketInputStream.java
src/share/classes/java/net/SocketInputStream.java
+4
-3
src/share/classes/java/net/SocketOutputStream.java
src/share/classes/java/net/SocketOutputStream.java
+5
-3
src/solaris/native/java/net/SocketOutputStream.c
src/solaris/native/java/net/SocketOutputStream.c
+25
-21
src/windows/native/java/net/SocketOutputStream.c
src/windows/native/java/net/SocketOutputStream.c
+57
-54
未找到文件。
src/share/classes/java/net/SocketInputStream.java
浏览文件 @
0e232e1d
/*
* Copyright (c) 1995, 201
3
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1995, 201
6
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -155,11 +155,12 @@ class SocketInputStream extends FileInputStream
}
// bounds check
if
(
length
<=
0
||
off
<
0
||
off
+
length
>
b
.
length
)
{
if
(
length
<=
0
||
off
<
0
||
length
>
b
.
length
-
off
)
{
if
(
length
==
0
)
{
return
0
;
}
throw
new
ArrayIndexOutOfBoundsException
();
throw
new
ArrayIndexOutOfBoundsException
(
"length == "
+
length
+
" off == "
+
off
+
" buffer length == "
+
b
.
length
);
}
boolean
gotReset
=
false
;
...
...
src/share/classes/java/net/SocketOutputStream.java
浏览文件 @
0e232e1d
/*
* Copyright (c) 1995, 201
3
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1995, 201
6
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -97,11 +97,13 @@ class SocketOutputStream extends FileOutputStream
*/
private
void
socketWrite
(
byte
b
[],
int
off
,
int
len
)
throws
IOException
{
if
(
len
<=
0
||
off
<
0
||
off
+
len
>
b
.
length
)
{
if
(
len
<=
0
||
off
<
0
||
len
>
b
.
length
-
off
)
{
if
(
len
==
0
)
{
return
;
}
throw
new
ArrayIndexOutOfBoundsException
();
throw
new
ArrayIndexOutOfBoundsException
(
"len == "
+
len
+
" off == "
+
off
+
" buffer length == "
+
b
.
length
);
}
FileDescriptor
fd
=
impl
.
acquireFD
();
...
...
src/solaris/native/java/net/SocketOutputStream.c
浏览文件 @
0e232e1d
...
...
@@ -103,31 +103,35 @@ Java_java_net_SocketOutputStream_socketWrite0(JNIEnv *env, jobject this,
int
llen
=
chunkLen
;
(
*
env
)
->
GetByteArrayRegion
(
env
,
data
,
off
,
chunkLen
,
(
jbyte
*
)
bufP
);
while
(
llen
>
0
)
{
int
n
=
NET_Send
(
fd
,
bufP
+
loff
,
llen
,
0
);
if
(
n
>
0
)
{
llen
-=
n
;
loff
+=
n
;
continue
;
}
if
(
n
==
JVM_IO_INTR
)
{
JNU_ThrowByName
(
env
,
"java/io/InterruptedIOException"
,
0
);
}
else
{
if
(
errno
==
ECONNRESET
)
{
JNU_ThrowByName
(
env
,
"sun/net/ConnectionResetException"
,
"Connection reset"
);
if
((
*
env
)
->
ExceptionCheck
(
env
))
{
break
;
}
else
{
while
(
llen
>
0
)
{
int
n
=
NET_Send
(
fd
,
bufP
+
loff
,
llen
,
0
);
if
(
n
>
0
)
{
llen
-=
n
;
loff
+=
n
;
continue
;
}
if
(
n
==
JVM_IO_INTR
)
{
JNU_ThrowByName
(
env
,
"java/io/InterruptedIOException"
,
0
);
}
else
{
NET_ThrowByNameWithLastError
(
env
,
"java/net/SocketException"
,
"Write failed"
);
if
(
errno
==
ECONNRESET
)
{
JNU_ThrowByName
(
env
,
"sun/net/ConnectionResetException"
,
"Connection reset"
);
}
else
{
NET_ThrowByNameWithLastError
(
env
,
"java/net/SocketException"
,
"Write failed"
);
}
}
if
(
bufP
!=
BUF
)
{
free
(
bufP
);
}
return
;
}
if
(
bufP
!=
BUF
)
{
free
(
bufP
);
}
return
;
len
-=
chunkLen
;
off
+=
chunkLen
;
}
len
-=
chunkLen
;
off
+=
chunkLen
;
}
if
(
bufP
!=
BUF
)
{
...
...
src/windows/native/java/net/SocketOutputStream.c
浏览文件 @
0e232e1d
/*
* Copyright (c) 1997, 20
08
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 20
16
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -100,66 +100,69 @@ Java_java_net_SocketOutputStream_socketWrite0(JNIEnv *env, jobject this,
int
retry
=
0
;
(
*
env
)
->
GetByteArrayRegion
(
env
,
data
,
off
,
chunkLen
,
(
jbyte
*
)
bufP
);
while
(
llen
>
0
)
{
int
n
=
send
(
fd
,
bufP
+
loff
,
llen
,
0
);
if
(
n
>
0
)
{
llen
-=
n
;
loff
+=
n
;
continue
;
}
/*
* Due to a bug in Windows Sockets (observed on NT and Windows
* 2000) it may be necessary to retry the send. The issue is that
* on blocking sockets send/WSASend is supposed to block if there
* is insufficient buffer space available. If there are a large
* number of threads blocked on write due to congestion then it's
* possile to hit the NT/2000 bug whereby send returns WSAENOBUFS.
* The workaround we use is to retry the send. If we have a
* large buffer to send (>2k) then we retry with a maximum of
* 2k buffer. If we hit the issue with <=2k buffer then we backoff
* for 1 second and retry again. We repeat this up to a reasonable
* limit before bailing out and throwing an exception. In load
* conditions we've observed that the send will succeed after 2-3
* attempts but this depends on network buffers associated with
* other sockets draining.
*/
if
(
WSAGetLastError
()
==
WSAENOBUFS
)
{
if
(
llen
>
MAX_BUFFER_LEN
)
{
buflen
=
MAX_BUFFER_LEN
;
chunkLen
=
MAX_BUFFER_LEN
;
llen
=
MAX_BUFFER_LEN
;
if
((
*
env
)
->
ExceptionCheck
(
env
))
{
break
;
}
else
{
while
(
llen
>
0
)
{
int
n
=
send
(
fd
,
bufP
+
loff
,
llen
,
0
);
if
(
n
>
0
)
{
llen
-=
n
;
loff
+=
n
;
continue
;
}
if
(
retry
>=
30
)
{
JNU_ThrowByName
(
env
,
JNU_JAVANETPKG
"SocketException"
,
"No buffer space available - exhausted attempts to queue buffer"
);
if
(
bufP
!=
BUF
)
{
free
(
bufP
);
/*
* Due to a bug in Windows Sockets (observed on NT and Windows
* 2000) it may be necessary to retry the send. The issue is that
* on blocking sockets send/WSASend is supposed to block if there
* is insufficient buffer space available. If there are a large
* number of threads blocked on write due to congestion then it's
* possile to hit the NT/2000 bug whereby send returns WSAENOBUFS.
* The workaround we use is to retry the send. If we have a
* large buffer to send (>2k) then we retry with a maximum of
* 2k buffer. If we hit the issue with <=2k buffer then we backoff
* for 1 second and retry again. We repeat this up to a reasonable
* limit before bailing out and throwing an exception. In load
* conditions we've observed that the send will succeed after 2-3
* attempts but this depends on network buffers associated with
* other sockets draining.
*/
if
(
WSAGetLastError
()
==
WSAENOBUFS
)
{
if
(
llen
>
MAX_BUFFER_LEN
)
{
buflen
=
MAX_BUFFER_LEN
;
chunkLen
=
MAX_BUFFER_LEN
;
llen
=
MAX_BUFFER_LEN
;
continue
;
}
if
(
retry
>=
30
)
{
JNU_ThrowByName
(
env
,
JNU_JAVANETPKG
"SocketException"
,
"No buffer space available - exhausted attempts to queue buffer"
);
if
(
bufP
!=
BUF
)
{
free
(
bufP
);
}
return
;
}
return
;
Sleep
(
1000
);
retry
++
;
continue
;
}
Sleep
(
1000
);
retry
++
;
continue
;
}
/*
* Send failed - can be caused by close or write error.
*/
if
(
WSAGetLastError
()
==
WSAENOTSOCK
)
{
JNU_ThrowByName
(
env
,
JNU_JAVANETPKG
"SocketException"
,
"Socket closed"
);
}
else
{
NET_ThrowCurrent
(
env
,
"socket write error"
);
}
if
(
bufP
!=
BUF
)
{
free
(
bufP
);
/*
* Send failed - can be caused by close or write error.
*/
if
(
WSAGetLastError
()
==
WSAENOTSOCK
)
{
JNU_ThrowByName
(
env
,
JNU_JAVANETPKG
"SocketException"
,
"Socket closed"
);
}
else
{
NET_ThrowCurrent
(
env
,
"socket write error"
);
}
if
(
bufP
!=
BUF
)
{
free
(
bufP
);
}
return
;
}
return
;
len
-=
chunkLen
;
off
+=
chunkLen
;
}
len
-=
chunkLen
;
off
+=
chunkLen
;
}
if
(
bufP
!=
BUF
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录