Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
六月暴雪飞梨花
SkyWalking
提交
d2f52f28
S
SkyWalking
项目概览
六月暴雪飞梨花
/
SkyWalking
与 Fork 源项目一致
Fork自
apache / SkyWalking
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
SkyWalking
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
d2f52f28
编写于
7月 18, 2019
作者:
wu-sheng
提交者:
GitHub
7月 18, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Make #finish more stable in async APIs (#3115)
* Make finish more stable in async APIs
上级
5b039e97
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
43 addition
and
35 deletion
+43
-35
apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java
...che/skywalking/apm/agent/core/context/TracingContext.java
+43
-35
未找到文件。
apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java
浏览文件 @
d2f52f28
...
@@ -18,14 +18,27 @@
...
@@ -18,14 +18,27 @@
package
org.apache.skywalking.apm.agent.core.context
;
package
org.apache.skywalking.apm.agent.core.context
;
import
java.util.*
;
import
java.util.LinkedList
;
import
java.util.List
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.concurrent.locks.ReentrantLock
;
import
java.util.concurrent.locks.ReentrantLock
;
import
org.apache.skywalking.apm.agent.core.boot.ServiceManager
;
import
org.apache.skywalking.apm.agent.core.boot.ServiceManager
;
import
org.apache.skywalking.apm.agent.core.conf.Config
;
import
org.apache.skywalking.apm.agent.core.conf.Config
;
import
org.apache.skywalking.apm.agent.core.context.trace.*
;
import
org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan
;
import
org.apache.skywalking.apm.agent.core.dictionary.*
;
import
org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan
;
import
org.apache.skywalking.apm.agent.core.logging.api.*
;
import
org.apache.skywalking.apm.agent.core.context.trace.EntrySpan
;
import
org.apache.skywalking.apm.agent.core.context.trace.ExitSpan
;
import
org.apache.skywalking.apm.agent.core.context.trace.LocalSpan
;
import
org.apache.skywalking.apm.agent.core.context.trace.NoopExitSpan
;
import
org.apache.skywalking.apm.agent.core.context.trace.NoopSpan
;
import
org.apache.skywalking.apm.agent.core.context.trace.TraceSegment
;
import
org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentRef
;
import
org.apache.skywalking.apm.agent.core.context.trace.WithPeerInfo
;
import
org.apache.skywalking.apm.agent.core.dictionary.DictionaryManager
;
import
org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil
;
import
org.apache.skywalking.apm.agent.core.dictionary.PossibleFound
;
import
org.apache.skywalking.apm.agent.core.logging.api.ILog
;
import
org.apache.skywalking.apm.agent.core.logging.api.LogManager
;
import
org.apache.skywalking.apm.agent.core.sampling.SamplingService
;
import
org.apache.skywalking.apm.agent.core.sampling.SamplingService
;
import
org.apache.skywalking.apm.util.StringUtil
;
import
org.apache.skywalking.apm.util.StringUtil
;
...
@@ -76,6 +89,8 @@ public class TracingContext implements AbstractTracerContext {
...
@@ -76,6 +89,8 @@ public class TracingContext implements AbstractTracerContext {
private
volatile
boolean
isRunningInAsyncMode
;
private
volatile
boolean
isRunningInAsyncMode
;
private
volatile
ReentrantLock
asyncFinishLock
;
private
volatile
ReentrantLock
asyncFinishLock
;
private
volatile
boolean
running
;
/**
/**
* Initialize all fields with default value.
* Initialize all fields with default value.
*/
*/
...
@@ -84,6 +99,7 @@ public class TracingContext implements AbstractTracerContext {
...
@@ -84,6 +99,7 @@ public class TracingContext implements AbstractTracerContext {
this
.
spanIdGenerator
=
0
;
this
.
spanIdGenerator
=
0
;
samplingService
=
ServiceManager
.
INSTANCE
.
findService
(
SamplingService
.
class
);
samplingService
=
ServiceManager
.
INSTANCE
.
findService
(
SamplingService
.
class
);
isRunningInAsyncMode
=
false
;
isRunningInAsyncMode
=
false
;
running
=
true
;
}
}
/**
/**
...
@@ -402,9 +418,7 @@ public class TracingContext implements AbstractTracerContext {
...
@@ -402,9 +418,7 @@ public class TracingContext implements AbstractTracerContext {
throw
new
IllegalStateException
(
"Stopping the unexpected span = "
+
span
);
throw
new
IllegalStateException
(
"Stopping the unexpected span = "
+
span
);
}
}
if
(
checkFinishConditions
())
{
finish
();
finish
();
}
return
activeSpanStack
.
isEmpty
();
return
activeSpanStack
.
isEmpty
();
}
}
...
@@ -425,46 +439,40 @@ public class TracingContext implements AbstractTracerContext {
...
@@ -425,46 +439,40 @@ public class TracingContext implements AbstractTracerContext {
@Override
public
void
asyncStop
(
AsyncSpan
span
)
{
@Override
public
void
asyncStop
(
AsyncSpan
span
)
{
asyncSpanCounter
.
addAndGet
(-
1
);
asyncSpanCounter
.
addAndGet
(-
1
);
finish
();
if
(
checkFinishConditions
())
{
finish
();
}
}
}
private
boolean
checkFinishConditions
()
{
/**
* Finish this context, and notify all {@link TracingContextListener}s, managed by {@link
* TracingContext.ListenerManager}
*/
private
void
finish
()
{
if
(
isRunningInAsyncMode
)
{
if
(
isRunningInAsyncMode
)
{
asyncFinishLock
.
lock
();
asyncFinishLock
.
lock
();
}
}
try
{
try
{
if
(
activeSpanStack
.
isEmpty
()
&&
(!
isRunningInAsyncMode
||
asyncSpanCounter
.
get
()
==
0
))
{
if
(
activeSpanStack
.
isEmpty
()
&&
running
&&
(!
isRunningInAsyncMode
||
asyncSpanCounter
.
get
()
==
0
))
{
return
true
;
TraceSegment
finishedSegment
=
segment
.
finish
(
isLimitMechanismWorking
());
/**
* Recheck the segment if the segment contains only one span.
* Because in the runtime, can't sure this segment is part of distributed trace.
*
* @see {@link #createSpan(String, long, boolean)}
*/
if
(!
segment
.
hasRef
()
&&
segment
.
isSingleSpanSegment
())
{
if
(!
samplingService
.
trySampling
())
{
finishedSegment
.
setIgnore
(
true
);
}
}
TracingContext
.
ListenerManager
.
notifyFinish
(
finishedSegment
);
running
=
false
;
}
}
}
finally
{
}
finally
{
if
(
isRunningInAsyncMode
)
{
if
(
isRunningInAsyncMode
)
{
asyncFinishLock
.
unlock
();
asyncFinishLock
.
unlock
();
}
}
}
}
return
false
;
}
/**
* Finish this context, and notify all {@link TracingContextListener}s, managed by {@link
* TracingContext.ListenerManager}
*/
private
void
finish
()
{
TraceSegment
finishedSegment
=
segment
.
finish
(
isLimitMechanismWorking
());
/**
* Recheck the segment if the segment contains only one span.
* Because in the runtime, can't sure this segment is part of distributed trace.
*
* @see {@link #createSpan(String, long, boolean)}
*/
if
(!
segment
.
hasRef
()
&&
segment
.
isSingleSpanSegment
())
{
if
(!
samplingService
.
trySampling
())
{
finishedSegment
.
setIgnore
(
true
);
}
}
TracingContext
.
ListenerManager
.
notifyFinish
(
finishedSegment
);
}
}
/**
/**
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录