Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
b3e4cfa0
提交
b3e4cfa0
authored
9 年前
作者:
John M Bradley
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Synchronize on undoLog when following MVMap get with TransactionMap getValue
上级
05015717
master
noel-pr1
plus33-master
pr/267
stumc-Issue#576
version-1.4.198
version-1.4.197
version-1.4.196
version-1.4.195
version-1.4.194
version-1.4.193
version-1.4.192
version-1.4.191
version-1.4.190
version-1.4.188
无相关合并请求
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
47 行增加
和
36 行删除
+47
-36
TransactionStore.java
h2/src/main/org/h2/mvstore/db/TransactionStore.java
+47
-36
没有找到文件。
h2/src/main/org/h2/mvstore/db/TransactionStore.java
浏览文件 @
b3e4cfa0
...
...
@@ -933,9 +933,11 @@ public class TransactionStore {
long
size
=
0
;
Cursor
<
K
,
VersionedValue
>
cursor
=
map
.
cursor
(
null
);
while
(
cursor
.
hasNext
())
{
K
key
=
cursor
.
next
();
VersionedValue
data
=
cursor
.
getValue
();
data
=
getValue
(
key
,
readLogId
,
data
);
VersionedValue
data
;
synchronized
(
transaction
.
store
.
undoLog
)
{
K
key
=
cursor
.
next
();
data
=
getValue
(
key
,
readLogId
,
cursor
.
getValue
());
}
if
(
data
!=
null
&&
data
.
value
!=
null
)
{
size
++;
}
...
...
@@ -1197,8 +1199,10 @@ public class TransactionStore {
}
private
VersionedValue
getValue
(
K
key
,
long
maxLog
)
{
VersionedValue
data
=
map
.
get
(
key
);
return
getValue
(
key
,
maxLog
,
data
);
synchronized
(
transaction
.
store
.
undoLog
)
{
VersionedValue
data
=
map
.
get
(
key
);
return
getValue
(
key
,
maxLog
,
data
);
}
}
/**
...
...
@@ -1210,6 +1214,13 @@ public class TransactionStore {
* @return the value
*/
VersionedValue
getValue
(
K
key
,
long
maxLog
,
VersionedValue
data
)
{
if
(
MVStore
.
ASSERT
)
{
if
(!
Thread
.
holdsLock
(
transaction
.
store
.
undoLog
))
{
throw
DataUtils
.
newIllegalStateException
(
DataUtils
.
ERROR_INTERNAL
,
"getValue not invoked while synchronized on undoLog"
);
}
}
while
(
true
)
{
if
(
data
==
null
)
{
// doesn't exist or deleted by a committed transaction
...
...
@@ -1229,9 +1240,7 @@ public class TransactionStore {
}
// get the value before the uncommitted transaction
Object
[]
d
;
synchronized
(
transaction
.
store
.
undoLog
)
{
d
=
transaction
.
store
.
undoLog
.
get
(
id
);
}
d
=
transaction
.
store
.
undoLog
.
get
(
id
);
if
(
d
==
null
)
{
// this entry should be committed or rolled back
// in the meantime (the transaction might still be open)
...
...
@@ -1441,36 +1450,38 @@ public class TransactionStore {
private
void
fetchNext
()
{
while
(
cursor
.
hasNext
())
{
K
k
;
try
{
k
=
cursor
.
next
();
}
catch
(
IllegalStateException
e
)
{
// TODO this is a bit ugly
if
(
DataUtils
.
getErrorCode
(
e
.
getMessage
())
==
DataUtils
.
ERROR_CHUNK_NOT_FOUND
)
{
cursor
=
map
.
cursor
(
currentKey
);
// we (should) get the current key again,
// we need to ignore that one
if
(!
cursor
.
hasNext
())
{
break
;
}
cursor
.
next
();
if
(!
cursor
.
hasNext
())
{
break
;
}
synchronized
(
transaction
.
store
.
undoLog
)
{
try
{
k
=
cursor
.
next
();
}
else
{
throw
e
;
}
catch
(
IllegalStateException
e
)
{
// TODO this is a bit ugly
if
(
DataUtils
.
getErrorCode
(
e
.
getMessage
())
==
DataUtils
.
ERROR_CHUNK_NOT_FOUND
)
{
cursor
=
map
.
cursor
(
currentKey
);
// we (should) get the current key again,
// we need to ignore that one
if
(!
cursor
.
hasNext
())
{
break
;
}
cursor
.
next
();
if
(!
cursor
.
hasNext
())
{
break
;
}
k
=
cursor
.
next
();
}
else
{
throw
e
;
}
}
final
K
key
=
k
;
VersionedValue
data
=
cursor
.
getValue
();
data
=
getValue
(
key
,
readLogId
,
data
);
if
(
data
!=
null
&&
data
.
value
!=
null
)
{
@SuppressWarnings
(
"unchecked"
)
final
V
value
=
(
V
)
data
.
value
;
current
=
new
DataUtils
.
MapEntry
<
K
,
V
>(
key
,
value
);
currentKey
=
key
;
return
;
}
}
final
K
key
=
k
;
VersionedValue
data
=
cursor
.
getValue
();
data
=
getValue
(
key
,
readLogId
,
data
);
if
(
data
!=
null
&&
data
.
value
!=
null
)
{
@SuppressWarnings
(
"unchecked"
)
final
V
value
=
(
V
)
data
.
value
;
current
=
new
DataUtils
.
MapEntry
<
K
,
V
>(
key
,
value
);
currentKey
=
key
;
return
;
}
}
current
=
null
;
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论