Skip to content

Commit 675b29e

Browse files
Merge pull request #6259 from tronprotocol/release_v4.8.0
merge Release v4.8.0 to Nile
2 parents 475e8f1 + 3e1ab7f commit 675b29e

File tree

16 files changed

+1818
-24
lines changed

16 files changed

+1818
-24
lines changed

common/build.gradle

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ dependencies {
3838
api group: 'com.typesafe', name: 'config', version: '1.3.2'
3939
api group: leveldbGroup, name: leveldbName, version: leveldbVersion
4040
api group: 'org.rocksdb', name: 'rocksdbjni', version: '5.15.10'
41-
// https://mvnrepository.com/artifact/org.quartz-scheduler/quartz
42-
api group: 'org.quartz-scheduler', name: 'quartz', version: '2.3.2'
4341
api group: 'io.prometheus', name: 'simpleclient', version: '0.15.0'
4442
api group: 'io.prometheus', name: 'simpleclient_httpserver', version: '0.15.0'
4543
api group: 'io.prometheus', name: 'simpleclient_hotspot', version: '0.15.0'

common/src/main/java/org/tron/common/cron/CronExpression.java

Lines changed: 1669 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.tron.common.cron;
2+
3+
class ValueSet {
4+
public int value;
5+
6+
public int pos;
7+
}

common/src/main/java/org/tron/common/parameter/CommonParameter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import java.util.Set;
99
import lombok.Getter;
1010
import lombok.Setter;
11-
import org.quartz.CronExpression;
11+
import org.tron.common.cron.CronExpression;
1212
import org.tron.common.args.GenesisBlock;
1313
import org.tron.common.config.DbBackupConfig;
1414
import org.tron.common.logsfilter.EventPluginConfig;

framework/src/main/java/org/tron/common/logsfilter/EventPluginLoader.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import java.util.Objects;
1010
import java.util.Set;
1111
import java.util.stream.Collectors;
12+
13+
import lombok.Getter;
1214
import lombok.extern.slf4j.Slf4j;
1315
import org.bouncycastle.util.encoders.Hex;
1416
import org.pf4j.CompoundPluginDescriptorFinder;
@@ -31,6 +33,8 @@ public class EventPluginLoader {
3133

3234
private static EventPluginLoader instance;
3335

36+
private long MAX_PENDING_SIZE = 50000;
37+
3438
private PluginManager pluginManager = null;
3539

3640
private List<IPluginEventListener> eventListeners;
@@ -73,6 +77,7 @@ public class EventPluginLoader {
7377

7478
private FilterQuery filterQuery;
7579

80+
@Getter
7681
private boolean useNativeQueue = false;
7782

7883
public static EventPluginLoader getInstance() {
@@ -537,6 +542,21 @@ public void postContractEventTrigger(ContractEventTrigger trigger) {
537542
}
538543
}
539544

545+
public boolean isBusy() {
546+
if (useNativeQueue) {
547+
return false;
548+
}
549+
int queueSize = 0;
550+
for (IPluginEventListener listener : eventListeners) {
551+
try {
552+
queueSize += listener.getPendingSize();
553+
} catch (AbstractMethodError error) {
554+
break;
555+
}
556+
}
557+
return queueSize >= MAX_PENDING_SIZE;
558+
}
559+
540560
private String toJsonString(Object data) {
541561
String jsonData = "";
542562

framework/src/main/java/org/tron/common/logsfilter/IPluginEventListener.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public interface IPluginEventListener extends ExtensionPoint {
1313
// start should be called after setServerAddress, setTopic, setDBConfig
1414
void start();
1515

16+
int getPendingSize();
17+
1618
void handleBlockEvent(Object trigger);
1719

1820
void handleTransactionTrigger(Object trigger);

framework/src/main/java/org/tron/core/config/args/Args.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
import lombok.extern.slf4j.Slf4j;
4343
import org.apache.commons.collections4.CollectionUtils;
4444
import org.apache.commons.lang3.StringUtils;
45-
import org.quartz.CronExpression;
45+
import org.tron.common.cron.CronExpression;
4646
import org.springframework.beans.factory.annotation.Autowired;
4747
import org.springframework.stereotype.Component;
4848
import org.tron.common.args.Account;

framework/src/main/java/org/tron/core/db/Manager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import lombok.extern.slf4j.Slf4j;
4747
import org.apache.commons.collections4.CollectionUtils;
4848
import org.bouncycastle.util.encoders.Hex;
49-
import org.quartz.CronExpression;
49+
import org.tron.common.cron.CronExpression;
5050
import org.springframework.beans.factory.annotation.Autowired;
5151
import org.springframework.stereotype.Component;
5252
import org.tron.api.GrpcAPI.TransactionInfoList;

framework/src/main/java/org/tron/core/services/event/BlockEventLoad.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.springframework.beans.factory.annotation.Autowired;
1010
import org.springframework.stereotype.Service;
1111
import org.tron.common.es.ExecutorServiceManager;
12+
import org.tron.common.logsfilter.EventPluginLoader;
1213
import org.tron.core.db.Manager;
1314
import org.tron.core.services.event.bo.BlockEvent;
1415
import org.tron.core.services.event.bo.Event;
@@ -26,13 +27,19 @@ public class BlockEventLoad {
2627
@Autowired
2728
private BlockEventGet blockEventGet;
2829

30+
private EventPluginLoader instance = EventPluginLoader.getInstance();
31+
2932
private final ScheduledExecutorService executor = ExecutorServiceManager
3033
.newSingleThreadScheduledExecutor("event-load");
3134

35+
private long MAX_LOAD_NUM = 100;
36+
3237
public void init() {
3338
executor.scheduleWithFixedDelay(() -> {
3439
try {
35-
load();
40+
if (!instance.isBusy()) {
41+
load();
42+
}
3643
} catch (Exception e) {
3744
close();
3845
logger.error("Event load service fail.", e);
@@ -62,6 +69,9 @@ public synchronized void load() throws Exception {
6269
if (cacheHeadNum >= tmpNum) {
6370
return;
6471
}
72+
if (tmpNum > cacheHeadNum + MAX_LOAD_NUM) {
73+
tmpNum = cacheHeadNum + MAX_LOAD_NUM;
74+
}
6575
List<BlockEvent> l1 = new ArrayList<>();
6676
List<BlockEvent> l2 = new ArrayList<>();
6777
BlockEvent tmp = BlockEventCache.getHead();

framework/src/main/java/org/tron/core/services/event/HistoryEventService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,17 @@ private void syncEvent() {
5555
long tmp = instance.getStartSyncBlockNum();
5656
long endNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum();
5757
while (tmp <= endNum) {
58+
if (instance.isUseNativeQueue()) {
59+
Thread.sleep(20);
60+
} else if (instance.isBusy()) {
61+
Thread.sleep(100);
62+
continue;
63+
}
5864
BlockEvent blockEvent = blockEventGet.getBlockEvent(tmp);
5965
realtimeEventService.flush(blockEvent, false);
6066
solidEventService.flush(blockEvent);
6167
tmp++;
6268
endNum = manager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum();
63-
Thread.sleep(30);
6469
}
6570
initEventService(manager.getChainBaseManager().getBlockIdByNum(endNum));
6671
} catch (InterruptedException e1) {

framework/src/test/java/org/tron/common/utils/ByteArrayMapTest.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
import static org.junit.Assert.assertThrows;
99
import static org.junit.Assert.assertTrue;
1010

11-
import com.mchange.v2.collection.MapEntry;
1211
import java.util.Collection;
1312
import java.util.HashSet;
1413
import java.util.Map;
14+
import java.util.Objects;
1515
import java.util.Set;
16+
import lombok.Getter;
1617
import org.junit.Before;
1718
import org.junit.Test;
18-
import org.tron.core.db.ByteArrayWrapper;
1919

2020
public class ByteArrayMapTest {
2121

@@ -142,4 +142,32 @@ public void test() {
142142
assertTrue(testMap.hashCode() <= 0);
143143
assertNotNull(testMap.toString());
144144
}
145+
146+
147+
@Getter
148+
static class MapEntry<K, V> implements Map.Entry<K, V> {
149+
K key;
150+
V value;
151+
152+
public MapEntry(K key, V value) {
153+
this.key = key;
154+
this.value = value;
155+
}
156+
157+
public V setValue(V o) {
158+
throw new UnsupportedOperationException();
159+
}
160+
161+
public boolean equals(Object o) {
162+
if (o instanceof Map.Entry) {
163+
Map.Entry<K, V> other = (Map.Entry<K, V>) o;
164+
return Objects.equals(key, other.getKey()) && Objects.equals(value, other.getValue());
165+
}
166+
return false;
167+
}
168+
169+
public int hashCode() {
170+
return Objects.hashCode(key) ^ Objects.hashCode(value);
171+
}
172+
}
145173
}

framework/src/test/java/org/tron/core/db/ManagerMockTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import org.mockito.invocation.InvocationOnMock;
3232
import org.mockito.stubbing.Answer;
3333

34-
import org.quartz.CronExpression;
34+
import org.tron.common.cron.CronExpression;
3535
import org.tron.common.parameter.CommonParameter;
3636
import org.tron.common.runtime.ProgramResult;
3737
import org.tron.common.utils.Sha256Hash;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.tron.core.event;
2+
3+
import static org.mockito.Mockito.mock;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import org.junit.Assert;
8+
import org.junit.Test;
9+
import org.mockito.Mockito;
10+
import org.tron.common.logsfilter.EventPluginLoader;
11+
import org.tron.common.logsfilter.IPluginEventListener;
12+
import org.tron.common.utils.ReflectUtils;
13+
14+
public class EventPluginLoaderTest {
15+
16+
@Test
17+
public void testIsBusy() {
18+
19+
EventPluginLoader eventPluginLoader = EventPluginLoader.getInstance();
20+
ReflectUtils.setFieldValue(eventPluginLoader, "useNativeQueue", true);
21+
boolean flag = eventPluginLoader.isBusy();
22+
Assert.assertFalse(flag);
23+
24+
ReflectUtils.setFieldValue(eventPluginLoader, "useNativeQueue", false);
25+
26+
IPluginEventListener p1 = mock(IPluginEventListener.class);
27+
List<IPluginEventListener> list = new ArrayList<>();
28+
list.add(p1);
29+
ReflectUtils.setFieldValue(eventPluginLoader, "eventListeners", list);
30+
31+
Mockito.when(p1.getPendingSize()).thenReturn(100);
32+
flag = eventPluginLoader.isBusy();
33+
Assert.assertFalse(flag);
34+
35+
Mockito.when(p1.getPendingSize()).thenReturn(60000);
36+
flag = eventPluginLoader.isBusy();
37+
Assert.assertTrue(flag);
38+
39+
Mockito.when(p1.getPendingSize()).thenThrow(new AbstractMethodError());
40+
flag = eventPluginLoader.isBusy();
41+
Assert.assertFalse(flag);
42+
}
43+
}

framework/src/test/java/org/tron/core/event/HistoryEventServiceTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ public class HistoryEventServiceTest {
2626
@Test
2727
public void test() throws Exception {
2828
EventPluginLoader instance = mock(EventPluginLoader.class);
29+
Mockito.when(instance.isUseNativeQueue()).thenReturn(true);
30+
Mockito.when(instance.isUseNativeQueue()).thenReturn(false);
31+
2932
ReflectUtils.setFieldValue(historyEventService, "instance", instance);
3033

3134
DynamicPropertiesStore dynamicPropertiesStore = mock(DynamicPropertiesStore.class);
@@ -39,6 +42,7 @@ public void test() throws Exception {
3942
SolidEventService solidEventService = new SolidEventService();
4043
RealtimeEventService realtimeEventService = new RealtimeEventService();
4144
BlockEventLoad blockEventLoad = new BlockEventLoad();
45+
ReflectUtils.setFieldValue(blockEventLoad, "instance", instance);
4246

4347
ReflectUtils.setFieldValue(historyEventService, "solidEventService", solidEventService);
4448
ReflectUtils.setFieldValue(historyEventService, "realtimeEventService", realtimeEventService);
@@ -77,11 +81,16 @@ public void test() throws Exception {
7781
Mockito.when(chainBaseManager.getBlockIdByNum(1L))
7882
.thenReturn(new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 1));
7983

84+
Mockito.when(instance.isUseNativeQueue()).thenReturn(true);
85+
8086
Method method1 = historyEventService.getClass().getDeclaredMethod("syncEvent");
8187
method1.setAccessible(true);
8288
method1.invoke(historyEventService);
8389

90+
Mockito.when(instance.isUseNativeQueue()).thenReturn(false);
91+
Mockito.when(instance.isBusy()).thenReturn(true);
8492
historyEventService.init();
93+
Thread.sleep(1000);
8594
historyEventService.close();
8695
}
8796
}

framework/src/test/java/org/tron/core/services/stop/BlockTimeStopTest.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import java.util.Date;
66
import lombok.extern.slf4j.Slf4j;
77
import org.junit.Assert;
8-
import org.quartz.CronExpression;
8+
import org.junit.Test;
9+
import org.tron.common.cron.CronExpression;
910
import org.tron.common.parameter.CommonParameter;
1011

1112
@Slf4j
@@ -25,6 +26,21 @@ public class BlockTimeStopTest extends ConditionallyStopTest {
2526
}
2627
}
2728

29+
@Test
30+
public void isValidExpression() {
31+
Assert.assertTrue(CronExpression.isValidExpression(cronExpression.getCronExpression()));
32+
ParseException err = Assert.assertThrows(ParseException.class, () ->
33+
CronExpression.validateExpression("invalid expression"));
34+
Assert.assertEquals("Illegal characters for this position: 'INV'", err.getMessage());
35+
}
36+
37+
@Test
38+
public void getNextTime() {
39+
Date date = cronExpression.getNextValidTimeAfter(new Date());
40+
Date invalidDate = cronExpression.getNextInvalidTimeAfter(new Date());
41+
Assert.assertNotEquals(date, invalidDate);
42+
}
43+
2844

2945
protected void initParameter(CommonParameter parameter) {
3046
parameter.setShutdownBlockTime(cronExpression);

gradle/verification-metadata.xml

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2088,19 +2088,6 @@
20882088
<sha256 value="bca2bb252c6ec5db92584af7ab26f787b14a155f587c3e30ec1e1da0d4164694" origin="Generated by Gradle"/>
20892089
</artifact>
20902090
</component>
2091-
<component group="org.quartz-scheduler" name="quartz" version="2.3.2">
2092-
<artifact name="quartz-2.3.2.jar">
2093-
<sha256 value="639c6a675bc472e1568df9d8c954ff702da6f83ed27da0ff9a7bd12ed73b8bf0" origin="Generated by Gradle"/>
2094-
</artifact>
2095-
<artifact name="quartz-2.3.2.pom">
2096-
<sha256 value="f5bca37862760be888bdeed62e9f1061d7486a7d14917949ce0a91f3899a11dc" origin="Generated by Gradle"/>
2097-
</artifact>
2098-
</component>
2099-
<component group="org.quartz-scheduler" name="quartz-parent" version="2.3.2">
2100-
<artifact name="quartz-parent-2.3.2.pom">
2101-
<sha256 value="24286b15786e3b5a71899f7ff0df17449820257475e3e74ece97f43a684a4463" origin="Generated by Gradle"/>
2102-
</artifact>
2103-
</component>
21042091
<component group="org.reactivestreams" name="reactive-streams" version="1.0.3">
21052092
<artifact name="reactive-streams-1.0.3.jar">
21062093
<sha256 value="1dee0481072d19c929b623e155e14d2f6085dc011529a0a0dbefc84cf571d865" origin="Generated by Gradle"/>

0 commit comments

Comments
 (0)