Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
423bf71c
提交
423bf71c
authored
6 年前
作者:
Andrei Tokar
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rolled back to a temporary thread pool use
上级
e833c48d
显示空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
34 行增加
和
30 行删除
+34
-30
MVStore.java
h2/src/main/org/h2/mvstore/MVStore.java
+34
-30
没有找到文件。
h2/src/main/org/h2/mvstore/MVStore.java
浏览文件 @
423bf71c
...
@@ -305,8 +305,6 @@ public class MVStore {
...
@@ -305,8 +305,6 @@ public class MVStore {
private
long
lastFreeUnusedChunks
;
private
long
lastFreeUnusedChunks
;
private
final
ThreadPoolExecutor
executorService
;
/**
/**
* Create and open the store.
* Create and open the store.
*
*
...
@@ -355,8 +353,6 @@ public class MVStore {
...
@@ -355,8 +353,6 @@ public class MVStore {
}
}
pageSplitSize
=
pgSplitSize
;
pageSplitSize
=
pgSplitSize
;
keysPerPage
=
DataUtils
.
getConfigParam
(
config
,
"keysPerPage"
,
48
);
keysPerPage
=
DataUtils
.
getConfigParam
(
config
,
"keysPerPage"
,
48
);
executorService
=
new
ThreadPoolExecutor
(
10
,
10
,
10L
,
TimeUnit
.
SECONDS
,
new
ArrayBlockingQueue
<
Runnable
>(
keysPerPage
+
1
));
backgroundExceptionHandler
=
backgroundExceptionHandler
=
(
UncaughtExceptionHandler
)
config
.
get
(
"backgroundExceptionHandler"
);
(
UncaughtExceptionHandler
)
config
.
get
(
"backgroundExceptionHandler"
);
meta
=
new
MVMap
<>(
this
);
meta
=
new
MVMap
<>(
this
);
...
@@ -945,11 +941,6 @@ public class MVStore {
...
@@ -945,11 +941,6 @@ public class MVStore {
return
;
return
;
}
}
stopBackgroundThread
();
stopBackgroundThread
();
if
(
shrinkIfPossible
)
{
executorService
.
shutdown
();
}
else
{
executorService
.
shutdownNow
();
}
closed
=
true
;
closed
=
true
;
storeLock
.
lock
();
storeLock
.
lock
();
try
{
try
{
...
@@ -1395,9 +1386,18 @@ public class MVStore {
...
@@ -1395,9 +1386,18 @@ public class MVStore {
}
}
}
}
/**
* Collect ids for chunks that are no longer in use.
* @param fast if true, simplified version is used, which assumes that recent chunks
* are still in-use and do not scan recent versions of the store.
* Also is this case only oldest available version of the store is scanned.
*/
private
Set
<
Integer
>
collectReferencedChunks
(
boolean
fast
)
{
private
Set
<
Integer
>
collectReferencedChunks
(
boolean
fast
)
{
assert
lastChunk
!=
null
;
assert
lastChunk
!=
null
;
final
ThreadPoolExecutor
executorService
=
new
ThreadPoolExecutor
(
10
,
10
,
10L
,
TimeUnit
.
SECONDS
,
new
ArrayBlockingQueue
<
Runnable
>(
keysPerPage
+
1
));
final
AtomicInteger
executingThreadCounter
=
new
AtomicInteger
(
0
);
final
AtomicInteger
executingThreadCounter
=
new
AtomicInteger
(
0
);
try
{
ChunkIdsCollector
collector
=
new
ChunkIdsCollector
(
meta
.
getId
());
ChunkIdsCollector
collector
=
new
ChunkIdsCollector
(
meta
.
getId
());
long
oldestVersionToKeep
=
getOldestVersionToKeep
();
long
oldestVersionToKeep
=
getOldestVersionToKeep
();
MVMap
.
RootReference
rootReference
=
meta
.
getRoot
();
MVMap
.
RootReference
rootReference
=
meta
.
getRoot
();
...
@@ -1406,7 +1406,7 @@ public class MVStore {
...
@@ -1406,7 +1406,7 @@ public class MVStore {
while
(
rootReference
.
version
>=
oldestVersionToKeep
&&
(
previous
=
rootReference
.
previous
)
!=
null
)
{
while
(
rootReference
.
version
>=
oldestVersionToKeep
&&
(
previous
=
rootReference
.
previous
)
!=
null
)
{
rootReference
=
previous
;
rootReference
=
previous
;
}
}
inspectVersion
(
rootReference
,
collector
,
executingThreadCounter
,
null
);
inspectVersion
(
rootReference
,
collector
,
executorService
,
executingThreadCounter
,
null
);
Page
rootPage
=
rootReference
.
root
;
Page
rootPage
=
rootReference
.
root
;
long
pos
=
rootPage
.
getPos
();
long
pos
=
rootPage
.
getPos
();
...
@@ -1418,13 +1418,17 @@ public class MVStore {
...
@@ -1418,13 +1418,17 @@ public class MVStore {
}
else
{
}
else
{
Set
<
Long
>
inspectedRoots
=
new
HashSet
<>();
Set
<
Long
>
inspectedRoots
=
new
HashSet
<>();
do
{
do
{
inspectVersion
(
rootReference
,
collector
,
executingThreadCounter
,
inspectedRoots
);
inspectVersion
(
rootReference
,
collector
,
executorService
,
executingThreadCounter
,
inspectedRoots
);
}
while
(
rootReference
.
version
>=
oldestVersionToKeep
&&
(
rootReference
=
rootReference
.
previous
)
!=
null
);
}
while
(
rootReference
.
version
>=
oldestVersionToKeep
&&
(
rootReference
=
rootReference
.
previous
)
!=
null
);
}
}
return
collector
.
getReferenced
();
return
collector
.
getReferenced
();
}
finally
{
executorService
.
shutdownNow
();
}
}
}
private
void
inspectVersion
(
MVMap
.
RootReference
rootReference
,
ChunkIdsCollector
collector
,
private
void
inspectVersion
(
MVMap
.
RootReference
rootReference
,
ChunkIdsCollector
collector
,
ThreadPoolExecutor
executorService
,
AtomicInteger
executingThreadCounter
,
AtomicInteger
executingThreadCounter
,
Set
<
Long
>
inspectedRoots
)
{
Set
<
Long
>
inspectedRoots
)
{
Page
rootPage
=
rootReference
.
root
;
Page
rootPage
=
rootReference
.
root
;
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论