Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
pulsar
提交
d1cb591d
pulsar
项目概览
apache
/
pulsar
通知
129
Star
40
Fork
3
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Wiki
1
Wiki
分析
仓库
DevOps
项目成员
Pages
pulsar
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Pages
分析
分析
仓库分析
DevOps
Wiki
1
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
提交
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
d1cb591d
编写于
3月 10, 2017
作者:
M
Matteo Merli
提交者:
GitHub
3月 10, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fixed race condition in cursor.asyncDelete() (#287)
上级
6d4bd9d2
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
54 addition
and
55 deletion
+54
-55
managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java
...org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java
+54
-55
未找到文件。
managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java
浏览文件 @
d1cb591d
...
...
@@ -1173,58 +1173,54 @@ public class ManagedCursorImpl implements ManagedCursor {
* @return the previous acknowledged position
*/
PositionImpl
setAcknowledgedPosition
(
PositionImpl
newMarkDeletePosition
)
{
lock
.
writeLock
().
lock
();
try
{
if
(
newMarkDeletePosition
.
compareTo
(
markDeletePosition
)
<
0
)
{
throw
new
IllegalArgumentException
(
"Mark deleting an already mark-deleted position"
);
}
if
(
readPosition
.
compareTo
(
newMarkDeletePosition
)
<=
0
)
{
// If the position that is mark-deleted is past the read position, it
// means that the client has skipped some entries. We need to move
// read position forward
PositionImpl
oldReadPosition
=
readPosition
;
readPosition
=
ledger
.
getNextValidPosition
(
newMarkDeletePosition
);
if
(
newMarkDeletePosition
.
compareTo
(
markDeletePosition
)
<
0
)
{
throw
new
IllegalArgumentException
(
"Mark deleting an already mark-deleted position"
);
}
if
(
log
.
isDebugEnabled
())
{
log
.
debug
(
"Moved read position from: {} to: {}"
,
oldReadPosition
,
readPosition
);
}
if
(
readPosition
.
compareTo
(
newMarkDeletePosition
)
<=
0
)
{
// If the position that is mark-deleted is past the read position, it
// means that the client has skipped some entries. We need to move
// read position forward
PositionImpl
oldReadPosition
=
readPosition
;
readPosition
=
ledger
.
getNextValidPosition
(
newMarkDeletePosition
);
oldReadPosition
.
recycle
();
if
(
log
.
isDebugEnabled
())
{
log
.
debug
(
"Moved read position from: {} to: {}"
,
oldReadPosition
,
readPosition
);
}
PositionImpl
oldMarkDeletePosition
=
markDeletePosition
;
oldReadPosition
.
recycle
();
}
if
(!
newMarkDeletePosition
.
equals
(
oldMarkDeletePosition
))
{
long
skippedEntries
=
0
;
if
(
newMarkDeletePosition
.
getLedgerId
()
==
oldMarkDeletePosition
.
getLedgerId
()
&&
newMarkDeletePosition
.
getEntryId
()
==
oldMarkDeletePosition
.
getEntryId
()
+
1
)
{
// Mark-deleting the position next to current one
skippedEntries
=
individualDeletedMessages
.
contains
(
newMarkDeletePosition
)
?
0
:
1
;
}
else
{
skippedEntries
=
getNumberOfEntries
(
Range
.
openClosed
(
oldMarkDeletePosition
,
newMarkDeletePosition
));
}
PositionImpl
positionAfterNewMarkDelete
=
ledger
.
getNextValidPosition
(
newMarkDeletePosition
);
if
(
individualDeletedMessages
.
contains
(
positionAfterNewMarkDelete
))
{
Range
<
PositionImpl
>
rangeToBeMarkDeleted
=
individualDeletedMessages
.
rangeContaining
(
positionAfterNewMarkDelete
);
newMarkDeletePosition
=
rangeToBeMarkDeleted
.
upperEndpoint
();
}
PositionImpl
oldMarkDeletePosition
=
markDeletePosition
;
if
(
log
.
isDebugEnabled
())
{
log
.
debug
(
"Moved ack position from: {} to: {} -- skipped: {}"
,
oldMarkDeletePosition
,
newMarkDeletePosition
,
skippedEntries
);
}
messagesConsumedCounter
+=
skippedEntries
;
if
(!
newMarkDeletePosition
.
equals
(
oldMarkDeletePosition
))
{
long
skippedEntries
=
0
;
if
(
newMarkDeletePosition
.
getLedgerId
()
==
oldMarkDeletePosition
.
getLedgerId
()
&&
newMarkDeletePosition
.
getEntryId
()
==
oldMarkDeletePosition
.
getEntryId
()
+
1
)
{
// Mark-deleting the position next to current one
skippedEntries
=
individualDeletedMessages
.
contains
(
newMarkDeletePosition
)
?
0
:
1
;
}
else
{
skippedEntries
=
getNumberOfEntries
(
Range
.
openClosed
(
oldMarkDeletePosition
,
newMarkDeletePosition
));
}
PositionImpl
positionAfterNewMarkDelete
=
ledger
.
getNextValidPosition
(
newMarkDeletePosition
);
if
(
individualDeletedMessages
.
contains
(
positionAfterNewMarkDelete
))
{
Range
<
PositionImpl
>
rangeToBeMarkDeleted
=
individualDeletedMessages
.
rangeContaining
(
positionAfterNewMarkDelete
);
newMarkDeletePosition
=
rangeToBeMarkDeleted
.
upperEndpoint
();
}
// markDelete-position and clear out deletedMsgSet
markDeletePosition
=
PositionImpl
.
get
(
newMarkDeletePosition
);
individualDeletedMessages
.
remove
(
Range
.
atMost
(
markDeletePosition
));
oldMarkDeletePosition
.
recycle
();
}
finally
{
lock
.
writeLock
().
unlock
();
if
(
log
.
isDebugEnabled
())
{
log
.
debug
(
"Moved ack position from: {} to: {} -- skipped: {}"
,
oldMarkDeletePosition
,
newMarkDeletePosition
,
skippedEntries
);
}
messagesConsumedCounter
+=
skippedEntries
;
}
// markDelete-position and clear out deletedMsgSet
markDeletePosition
=
PositionImpl
.
get
(
newMarkDeletePosition
);
individualDeletedMessages
.
remove
(
Range
.
atMost
(
markDeletePosition
));
oldMarkDeletePosition
.
recycle
();
return
newMarkDeletePosition
;
}
...
...
@@ -1254,11 +1250,14 @@ public class ManagedCursorImpl implements ManagedCursor {
}
PositionImpl
newPosition
=
(
PositionImpl
)
position
;
lock
.
writeLock
().
lock
();
try
{
newPosition
=
setAcknowledgedPosition
(
newPosition
);
}
catch
(
IllegalArgumentException
e
)
{
callback
.
markDeleteFailed
(
new
ManagedLedgerException
(
e
),
ctx
);
return
;
}
finally
{
lock
.
writeLock
().
unlock
();
}
// Apply rate limiting to mark-delete operations
...
...
@@ -1487,6 +1486,12 @@ public class ManagedCursorImpl implements ManagedCursor {
newMarkDeletePosition
=
range
.
upperEndpoint
();
}
}
if
(
newMarkDeletePosition
!=
null
)
{
newMarkDeletePosition
=
setAcknowledgedPosition
(
newMarkDeletePosition
);
}
else
{
newMarkDeletePosition
=
markDeletePosition
;
}
}
catch
(
Exception
e
)
{
log
.
warn
(
"[{}] [{}] Error while updating individualDeletedMessages [{}]"
,
ledger
.
getName
(),
name
,
e
.
getMessage
(),
e
);
...
...
@@ -1496,19 +1501,13 @@ public class ManagedCursorImpl implements ManagedCursor {
lock
.
writeLock
().
unlock
();
}
try
{
if
(
newMarkDeletePosition
!=
null
)
{
newMarkDeletePosition
=
setAcknowledgedPosition
(
newMarkDeletePosition
);
}
else
{
newMarkDeletePosition
=
markDeletePosition
;
}
// Apply rate limiting to mark-delete operations
if
(
markDeleteLimiter
!=
null
&&
!
markDeleteLimiter
.
tryAcquire
())
{
callback
.
deleteComplete
(
ctx
);
return
;
}
// Apply rate limiting to mark-delete operations
if
(
markDeleteLimiter
!=
null
&&
!
markDeleteLimiter
.
tryAcquire
())
{
callback
.
deleteComplete
(
ctx
);
return
;
}
try
{
internalAsyncMarkDelete
(
newMarkDeletePosition
,
new
MarkDeleteCallback
()
{
@Override
public
void
markDeleteComplete
(
Object
ctx
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录