Skip to content

Commit ff1c728

Browse files
committed
feat: fix sonar
1 parent 9570fd4 commit ff1c728

File tree

21 files changed

+193
-47
lines changed

21 files changed

+193
-47
lines changed

arex-agent-bootstrap/src/main/java/io/arex/agent/bootstrap/model/ArexMocker.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ public class ArexMocker implements Mocker {
2424
private transient Map<Integer, Long> eigenMap;
2525
private Map<String, String> tags;
2626

27+
// original compressed text for request
2728
private transient String request;
29+
// original compressed text for response
2830
private transient String response;
2931

3032
/**

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/config/Config.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,10 @@ public class Config {
2424
private static final char SEPARATOR = ',';
2525
private static Config INSTANCE = null;
2626

27-
static void update(boolean enableDebug, String serviceName, List<DynamicClassEntity> dynamicClassList,
28-
Map<String, String> properties, Set<String> excludeServiceOperations,
29-
int dubboStreamReplayThreshold, int recordRate, CompareConfigurationEntity compareConfigurationEntity) {
30-
INSTANCE = new Config(enableDebug, serviceName, dynamicClassList, properties,
31-
excludeServiceOperations,
32-
dubboStreamReplayThreshold, recordRate, compareConfigurationEntity);
27+
static void update(boolean enableDebug, String serviceName,
28+
int dubboStreamReplayThreshold, int recordRate, ConfigExtendEntity extendEntity) {
29+
INSTANCE = new Config(enableDebug, serviceName,
30+
dubboStreamReplayThreshold, recordRate, extendEntity);
3331
}
3432

3533
public static Config get() {
@@ -51,22 +49,21 @@ public static Config get() {
5149
private final Map<String, String> mockerTags;
5250
private final CompareConfigurationEntity compareConfigurationEntity;
5351

54-
Config(boolean enableDebug, String serviceName, List<DynamicClassEntity> dynamicClassList,
55-
Map<String, String> properties, Set<String> excludeServiceOperations, int dubboStreamReplayThreshold,
56-
int recordRate, CompareConfigurationEntity compareConfigurationEntity) {
52+
Config(boolean enableDebug, String serviceName, int dubboStreamReplayThreshold,
53+
int recordRate, ConfigExtendEntity extendEntity) {
5754
this.enableDebug = enableDebug;
5855
this.serviceName = serviceName;
59-
this.dynamicClassList = dynamicClassList;
60-
this.properties = properties;
61-
this.excludeServiceOperations = buildExcludeServiceOperations(excludeServiceOperations);
56+
this.dynamicClassList = extendEntity.getDynamicClassList();
57+
this.properties = extendEntity.getProperties();
58+
this.excludeServiceOperations = buildExcludeServiceOperations(extendEntity.getExcludeServiceOperations());
6259
this.dubboStreamReplayThreshold = dubboStreamReplayThreshold;
6360
this.recordRate = recordRate;
6461
this.recordVersion = properties.get("arex.agent.version");
6562
this.includeServiceOperations = StringUtil.splitToSet(properties.get("includeServiceOperations"), SEPARATOR);
6663
this.mockerTags = StringUtil.asMap(System.getProperty(ConfigConstants.MOCKER_TAGS));
6764
buildCoveragePackages(properties);
6865
buildDynamicClassInfo();
69-
this.compareConfigurationEntity = compareConfigurationEntity;
66+
this.compareConfigurationEntity = extendEntity.getCompareConfigurationEntity();
7067
}
7168

7269
/**

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/config/ConfigBuilder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ public ConfigBuilder recordRate(int recordRate) {
7777
}
7878

7979
public void build() {
80-
Config.update(enableDebug, serviceName, dynamicClassList, Collections.unmodifiableMap(new HashMap<>(properties)),
81-
excludeServiceOperations, dubboStreamReplayThreshold, recordRate, compareConfigurationEntity);
80+
Config.update(enableDebug, serviceName, dubboStreamReplayThreshold, recordRate,
81+
ConfigExtendEntity.of(dynamicClassList, Collections.unmodifiableMap(new HashMap<>(properties)),
82+
excludeServiceOperations, compareConfigurationEntity));
8283
}
8384
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package io.arex.inst.runtime.config;
2+
3+
import io.arex.inst.runtime.model.CompareConfigurationEntity;
4+
import io.arex.inst.runtime.model.DynamicClassEntity;
5+
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.Set;
9+
10+
public class ConfigExtendEntity {
11+
private final List<DynamicClassEntity> dynamicClassList;
12+
private final Map<String, String> properties;
13+
private final Set<String> excludeServiceOperations;
14+
private final CompareConfigurationEntity compareConfigurationEntity;
15+
16+
private ConfigExtendEntity(List<DynamicClassEntity> dynamicClassList,
17+
Map<String, String> properties, Set<String> excludeServiceOperations,
18+
CompareConfigurationEntity compareConfigurationEntity) {
19+
this.dynamicClassList = dynamicClassList;
20+
this.properties = properties;
21+
this.excludeServiceOperations = excludeServiceOperations;
22+
this.compareConfigurationEntity = compareConfigurationEntity;
23+
}
24+
25+
public static ConfigExtendEntity of(List<DynamicClassEntity> dynamicClassList,
26+
Map<String, String> properties, Set<String> excludeServiceOperations,
27+
CompareConfigurationEntity compareConfigurationEntity) {
28+
return new ConfigExtendEntity(dynamicClassList, properties, excludeServiceOperations,
29+
compareConfigurationEntity);
30+
}
31+
32+
public List<DynamicClassEntity> getDynamicClassList() {
33+
return dynamicClassList;
34+
}
35+
36+
public Map<String, String> getProperties() {
37+
return properties;
38+
}
39+
40+
public Set<String> getExcludeServiceOperations() {
41+
return excludeServiceOperations;
42+
}
43+
44+
public CompareConfigurationEntity getCompareConfigurationEntity() {
45+
return compareConfigurationEntity;
46+
}
47+
}

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/context/ArexContext.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
import io.arex.agent.bootstrap.util.StringUtil;
66
import io.arex.inst.runtime.model.ArexConstants;
77
import io.arex.inst.runtime.model.ReplayCompareResultDTO;
8-
import io.arex.inst.runtime.util.MergeRecordUtil;
9-
import io.arex.inst.runtime.util.ReplayUtil;
8+
import io.arex.inst.runtime.util.MockManager;
109

1110
import java.util.*;
1211
import java.util.concurrent.ConcurrentHashMap;
@@ -177,7 +176,7 @@ public void clear() {
177176
methodSignatureHashList.clear();
178177
}
179178
if (cachedReplayResultMap != null) {
180-
ReplayUtil.saveRemainCompareResult(this);
179+
MockManager.saveReplayRemainCompareRelation(this);
181180
cachedReplayResultMap.clear();
182181
}
183182
if (excludeMockTemplate != null) {
@@ -188,7 +187,7 @@ public void clear() {
188187
}
189188
if (mergeRecordQueue != null) {
190189
// async thread merge record (main entry has ended)
191-
MergeRecordUtil.recordRemain(this);
190+
MockManager.recordRemain(this);
192191
mergeRecordQueue.clear();
193192
}
194193
if (replayCompareResultQueue != null) {

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/listener/EventProcessor.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.arex.agent.bootstrap.util.StringUtil;
1010
import io.arex.agent.bootstrap.util.ServiceLoader;
1111
import io.arex.inst.runtime.config.Config;
12+
import io.arex.inst.runtime.model.ArexConstants;
1213
import io.arex.inst.runtime.model.InitializeEnum;
1314
import io.arex.inst.runtime.request.RequestHandlerManager;
1415
import io.arex.inst.runtime.log.LogManager;
@@ -24,6 +25,8 @@
2425

2526
import java.util.Set;
2627
import java.util.concurrent.CompletableFuture;
28+
import java.util.concurrent.ScheduledThreadPoolExecutor;
29+
import java.util.concurrent.TimeUnit;
2730
import java.util.concurrent.atomic.AtomicReference;
2831

2932
import io.arex.inst.runtime.util.ReplayUtil;
@@ -37,6 +40,10 @@ public class EventProcessor {
3740
private static final AtomicReference<InitializeEnum> INIT_DEPENDENCY = new AtomicReference<>(InitializeEnum.START);
3841
private static final Method FIND_LOADED_METHOD = ReflectUtil.getMethod(ClassLoader.class, "findLoadedClass", String.class);
3942
private static boolean existJacksonDependency = true;
43+
44+
private static final ScheduledThreadPoolExecutor SCHEDULER =
45+
new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "arex-replay-manager-thread"));
46+
4047
static {
4148
try {
4249
Class.forName("com.fasterxml.jackson.databind.ObjectMapper",true, Thread.currentThread().getContextClassLoader());
@@ -113,6 +120,13 @@ private static void initClock(){
113120
public static void onExit(){
114121
ReplayUtil.saveReplayCompareResult();
115122
ContextManager.remove();
123+
// if replay plan complete end(the last replay case), delay clear context (include async thread context)
124+
ArexContext context = ContextManager.currentContext();
125+
if (context.getAttachment(ArexConstants.REPLAY_END_FLAG) != null
126+
&& Boolean.parseBoolean(String.valueOf(context.getAttachment(ArexConstants.REPLAY_END_FLAG)))) {
127+
// must contain LatencyContextHashMap#overdueCleanUp time(1 minutes)
128+
SCHEDULER.schedule(ContextManager::clear, 2, TimeUnit.MINUTES);
129+
}
116130
}
117131

118132
/**

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/match/ReplayMatcher.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public static Mocker match(Mocker requestMocker, MockStrategyEnum mockStrategy)
4040

4141
logMatchResult(context);
4242

43-
setCompareResult(context);
43+
saveCompareResult(context);
4444

4545
return context.getMatchMocker();
4646
}
@@ -123,11 +123,11 @@ private static void logMatchResult(MatchStrategyContext context) {
123123
* new call (recordMocker is null)
124124
* (call missing after entry point)
125125
*/
126-
private static void setCompareResult(MatchStrategyContext context) {
126+
private static boolean saveCompareResult(MatchStrategyContext context) {
127127
Mocker replayMocker = context.getRequestMocker();
128128
boolean isEntryPoint = replayMocker.getCategoryType().isEntryPoint();
129129
if (replayMocker.getCategoryType().isSkipComparison() && !isEntryPoint) {
130-
return;
130+
return false;
131131
}
132132

133133
String recordMsg = null;
@@ -155,6 +155,6 @@ private static void setCompareResult(MatchStrategyContext context) {
155155
ReplayCompareResultDTO compareResultDTO = ReplayUtil.convertCompareResult(
156156
replayMocker, recordMsg, replayMsg, recordTime, replayTime, sameMsg);
157157
compareResultDTO.setExtendMessage(extendMessage);
158-
replayCompareResultQueue.offer(compareResultDTO);
158+
return replayCompareResultQueue.offer(compareResultDTO);
159159
}
160160
}

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/match/key/DatabaseMatchKeyBuilderImpl.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -133,19 +133,26 @@ private static int findIndexWholeIgnoreCase(String source, int sourceCount, Stri
133133
while (++i <= max && firstCharacterWordBoundaryNotMatch(source, first, i)) {}
134134
}
135135
// Found first character, now look at the rest of target
136-
if (i <= max) {
137-
int j = i + 1;
138-
int end = j + targetCount - 1;
139-
for (int k = 1; j < end && equalsIgnoreCase(source.charAt(j), target.charAt(k)); j++, k++) {}
140-
if (j == end && isWordBoundary(source, j)) {
141-
// Found whole string
142-
return i;
143-
}
136+
if (findFirstChar(i, max, targetCount, source, target)) {
137+
return i;
144138
}
145139
}
146140
return INDEX_NOT_FOUND;
147141
}
148142

143+
private static boolean findFirstChar(int i, int max, int targetCount, String source, String target) {
144+
if (i <= max) {
145+
int j = i + 1;
146+
int end = j + targetCount - 1;
147+
for (int k = 1; j < end && equalsIgnoreCase(source.charAt(j), target.charAt(k)); j++, k++) {}
148+
if (j == end && isWordBoundary(source, j)) {
149+
// Found whole string
150+
return true;
151+
}
152+
}
153+
return false;
154+
}
155+
149156
private static boolean readShouldTerminal(char src) {
150157
return src == SQL_BATCH_TERMINAL_CHAR || isWhitespace(src);
151158
}

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/match/strategy/EigenMatchStrategy.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ private int coincidePath(Map<Integer, Long> replayEigenMap, Map<Integer, Long> r
7575
return row;
7676
}
7777

78-
for (Integer key : recordEigenMap.keySet()) {
79-
Long recordPathValue = recordEigenMap.get(key);
80-
Long replayPathValue = replayEigenMap.get(key);
78+
for (Map.Entry<Integer, Long> recordEigenEntry : recordEigenMap.entrySet()) {
79+
Long recordPathValue = recordEigenEntry.getValue();
80+
Long replayPathValue = replayEigenMap.get(recordEigenEntry.getKey());
8181
if (Objects.equals(recordPathValue, replayPathValue)) {
8282
row ++;
8383
}

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/model/ArexConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,5 @@ private ArexConstants() {}
8080
public static final String MATCH_LOG_TITLE = "replay.match";
8181
public static final String MOCKER_TARGET_TYPE = "io.arex.agent.bootstrap.model.Mocker$Target";
8282
public static final String SPRING_SCAN_PACKAGES = "arex.spring.scan.packages";
83+
public static final String REPLAY_END_FLAG = "arex-replay-end";
8384
}

0 commit comments

Comments
 (0)