Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Iotdb
提交
049c0984
I
Iotdb
项目概览
apache
/
Iotdb
大约 1 年 前同步成功
通知
25
Star
3344
Fork
916
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
Iotdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
049c0984
编写于
8月 19, 2021
作者:
S
Steve Yurong Su
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
optimize session creation
上级
df4e110d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
70 addition
and
70 deletion
+70
-70
session/src/main/java/org/apache/iotdb/session/pool/SessionPool.java
.../main/java/org/apache/iotdb/session/pool/SessionPool.java
+70
-70
未找到文件。
session/src/main/java/org/apache/iotdb/session/pool/SessionPool.java
浏览文件 @
049c0984
...
...
@@ -174,7 +174,6 @@ public class SessionPool {
// if this method throws an exception, either the server is broken, or the ip/port/user/password
// is incorrect.
@SuppressWarnings
({
"squid:S3776"
,
"squid:S2446"
})
// Suppress high Cognitive Complexity warning
private
Session
getSession
()
throws
IoTDBConnectionException
{
Session
session
=
queue
.
poll
();
...
...
@@ -183,91 +182,92 @@ public class SessionPool {
}
if
(
session
!=
null
)
{
return
session
;
}
else
{
long
start
=
System
.
currentTimeMillis
();
boolean
canCreate
=
false
;
}
boolean
shouldCreate
=
false
;
long
start
=
System
.
currentTimeMillis
();
while
(
session
==
null
)
{
synchronized
(
this
)
{
if
(
size
<
maxSize
)
{
// we can create more session
size
++;
can
Create
=
true
;
should
Create
=
true
;
// but we do it after skip synchronized block because connection a session is time
// consuming.
break
;
}
}
if
(
canCreate
)
{
// create a new one.
if
(
logger
.
isDebugEnabled
())
{
logger
.
debug
(
"Create a new Session {}, {}, {}, {}"
,
ip
,
port
,
user
,
password
);
}
session
=
new
Session
(
ip
,
port
,
user
,
password
,
fetchSize
,
zoneId
,
enableCacheLeader
);
// we have to wait for someone returns a session.
try
{
session
.
open
(
enableCompression
);
// avoid someone has called close() the session pool
synchronized
(
this
)
{
if
(
closed
)
{
// have to release the connection...
session
.
close
();
throw
new
IoTDBConnectionException
(
SESSION_POOL_IS_CLOSED
);
}
else
{
return
session
;
}
if
(
logger
.
isDebugEnabled
())
{
logger
.
debug
(
"no more sessions can be created, wait... queue.size={}"
,
queue
.
size
());
}
}
catch
(
IoTDBConnectionException
e
)
{
// if exception, we will throw the exception.
// Meanwhile, we have to set size--
synchronized
(
this
)
{
size
--;
// we do not need to notifyAll as any waited thread can continue to work after waked up.
this
.
notify
();
if
(
logger
.
isDebugEnabled
())
{
logger
.
debug
(
"open session failed, reduce the count and notify others..."
);
this
.
wait
(
1000
);
long
time
=
timeout
<
60_000
?
timeout
:
60_000
;
if
(
System
.
currentTimeMillis
()
-
start
>
time
)
{
logger
.
warn
(
"the SessionPool has wait for {} seconds to get a new connection: {}:{} with {}, {}"
,
(
System
.
currentTimeMillis
()
-
start
)
/
1000
,
ip
,
port
,
user
,
password
);
logger
.
warn
(
"current occupied size {}, queue size {}, considered size {} "
,
occupied
.
size
(),
queue
.
size
(),
size
);
if
(
System
.
currentTimeMillis
()
-
start
>
timeout
)
{
throw
new
IoTDBConnectionException
(
String
.
format
(
"timeout to get a connection from %s:%s"
,
ip
,
port
));
}
}
throw
e
;
}
catch
(
InterruptedException
e
)
{
logger
.
error
(
"the SessionPool is damaged"
,
e
);
Thread
.
currentThread
().
interrupt
();
}
}
else
{
while
(
session
==
null
)
{
synchronized
(
this
)
{
if
(
closed
)
{
throw
new
IoTDBConnectionException
(
SESSION_POOL_IS_CLOSED
);
}
// we have to wait for someone returns a session.
try
{
if
(
logger
.
isDebugEnabled
())
{
logger
.
debug
(
"no more sessions can be created, wait... queue.size={}"
,
queue
.
size
());
}
this
.
wait
(
1000
);
long
time
=
timeout
<
60_000
?
timeout
:
60_000
;
if
(
System
.
currentTimeMillis
()
-
start
>
time
)
{
logger
.
warn
(
"the SessionPool has wait for {} seconds to get a new connection: {}:{} with {}, {}"
,
(
System
.
currentTimeMillis
()
-
start
)
/
1000
,
ip
,
port
,
user
,
password
);
logger
.
warn
(
"current occupied size {}, queue size {}, considered size {} "
,
occupied
.
size
(),
queue
.
size
(),
size
);
if
(
System
.
currentTimeMillis
()
-
start
>
timeout
)
{
throw
new
IoTDBConnectionException
(
String
.
format
(
"timeout to get a connection from %s:%s"
,
ip
,
port
));
}
}
}
catch
(
InterruptedException
e
)
{
logger
.
error
(
"the SessionPool is damaged"
,
e
);
Thread
.
currentThread
().
interrupt
();
}
session
=
queue
.
poll
();
session
=
queue
.
poll
();
if
(
closed
)
{
throw
new
IoTDBConnectionException
(
SESSION_POOL_IS_CLOSED
);
}
}
}
if
(
shouldCreate
)
{
// create a new one.
if
(
logger
.
isDebugEnabled
())
{
logger
.
debug
(
"Create a new Session {}, {}, {}, {}"
,
ip
,
port
,
user
,
password
);
}
session
=
new
Session
(
ip
,
port
,
user
,
password
,
fetchSize
,
zoneId
,
enableCacheLeader
);
try
{
session
.
open
(
enableCompression
);
// avoid someone has called close() the session pool
synchronized
(
this
)
{
if
(
closed
)
{
// have to release the connection...
session
.
close
();
throw
new
IoTDBConnectionException
(
SESSION_POOL_IS_CLOSED
);
}
}
return
session
;
}
catch
(
IoTDBConnectionException
e
)
{
// if exception, we will throw the exception.
// Meanwhile, we have to set size--
synchronized
(
this
)
{
size
--;
// we do not need to notifyAll as any waited thread can continue to work after waked up.
this
.
notify
();
if
(
logger
.
isDebugEnabled
())
{
logger
.
debug
(
"open session failed, reduce the count and notify others..."
);
}
}
throw
e
;
}
}
return
session
;
}
public
int
currentAvailableSize
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录