Skip to content

Commit a4100b6

Browse files
authored
feat(db):tune the databases closure (#5429)
1 parent e1d096b commit a4100b6

9 files changed

Lines changed: 140 additions & 84 deletions

File tree

chainbase/src/main/java/org/tron/core/ChainBaseManager.java

Lines changed: 4 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@
2828
import org.tron.core.db.PbftSignDataStore;
2929
import org.tron.core.db.RecentBlockStore;
3030
import org.tron.core.db.RecentTransactionStore;
31-
import org.tron.core.db.TransactionCache;
3231
import org.tron.core.db.TransactionStore;
33-
import org.tron.core.db2.core.ITronChainBase;
3432
import org.tron.core.exception.BadItemException;
3533
import org.tron.core.exception.HeaderNotFound;
3634
import org.tron.core.exception.ItemNotFoundException;
@@ -238,9 +236,6 @@ public class ChainBaseManager {
238236
@Autowired
239237
private DbStatService dbStatService;
240238

241-
@Autowired
242-
private TransactionCache transactionCache;
243-
244239
@Getter
245240
@Setter
246241
private NodeType nodeType;
@@ -249,55 +244,6 @@ public class ChainBaseManager {
249244
@Setter
250245
private long lowestBlockNum = -1; // except num = 0.
251246

252-
public void closeOneStore(ITronChainBase database) {
253-
logger.info("******** Begin to close {}. ********", database.getName());
254-
try {
255-
database.close();
256-
} catch (Exception e) {
257-
logger.info("Failed to close {}.", database.getName(), e);
258-
} finally {
259-
logger.info("******** End to close {}. ********", database.getName());
260-
}
261-
}
262-
263-
public void closeAllStore() {
264-
dbStatService.shutdown();
265-
closeOneStore(transactionRetStore);
266-
closeOneStore(recentBlockStore);
267-
closeOneStore(transactionHistoryStore);
268-
closeOneStore(transactionStore);
269-
closeOneStore(accountStore);
270-
closeOneStore(blockStore);
271-
closeOneStore(blockIndexStore);
272-
closeOneStore(accountIdIndexStore);
273-
closeOneStore(accountIndexStore);
274-
closeOneStore(witnessScheduleStore);
275-
closeOneStore(assetIssueStore);
276-
closeOneStore(dynamicPropertiesStore);
277-
closeOneStore(abiStore);
278-
closeOneStore(codeStore);
279-
closeOneStore(contractStore);
280-
closeOneStore(contractStateStore);
281-
closeOneStore(storageRowStore);
282-
closeOneStore(exchangeStore);
283-
closeOneStore(proposalStore);
284-
closeOneStore(votesStore);
285-
closeOneStore(delegatedResourceStore);
286-
closeOneStore(delegatedResourceAccountIndexStore);
287-
closeOneStore(assetIssueV2Store);
288-
closeOneStore(exchangeV2Store);
289-
closeOneStore(nullifierStore);
290-
closeOneStore(merkleTreeStore);
291-
closeOneStore(delegationStore);
292-
closeOneStore(proofStore);
293-
closeOneStore(commonStore);
294-
closeOneStore(commonDataBase);
295-
closeOneStore(pbftSignDataStore);
296-
closeOneStore(sectionBloomStore);
297-
closeOneStore(accountAssetStore);
298-
closeOneStore(transactionCache);
299-
}
300-
301247
// for test only
302248
public List<ByteString> getWitnesses() {
303249
return witnessScheduleStore.getActiveWitnesses();
@@ -437,6 +383,10 @@ private void init() {
437383
this.nodeType = getLowestBlockNum() > 1 ? NodeType.LITE : NodeType.FULL;
438384
}
439385

386+
public void shutdown() {
387+
dbStatService.shutdown();
388+
}
389+
440390
public boolean isLiteNode() {
441391
return getNodeType() == NodeType.LITE;
442392
}

chainbase/src/main/java/org/tron/core/db/TronDatabase.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,14 @@ public void reset() {
9494
*/
9595
@Override
9696
public void close() {
97-
dbSource.closeDB();
97+
logger.info("******** Begin to close {}. ********", getName());
98+
try {
99+
dbSource.closeDB();
100+
} catch (Exception e) {
101+
logger.warn("Failed to close {}.", getName(), e);
102+
} finally {
103+
logger.info("******** End to close {}. ********", getName());
104+
}
98105
}
99106

100107
public abstract void put(byte[] key, T item);

chainbase/src/main/java/org/tron/core/db/TronStoreWithRevoking.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,14 @@ public String getName() {
182182

183183
@Override
184184
public void close() {
185-
revokingDB.close();
185+
logger.info("******** Begin to close {}. ********", getName());
186+
try {
187+
revokingDB.close();
188+
} catch (Exception e) {
189+
logger.warn("Failed to close {}.", getName(), e);
190+
} finally {
191+
logger.info("******** End to close {}. ********", getName());
192+
}
186193
}
187194

188195
@Override

chainbase/src/main/java/org/tron/core/db2/common/TxCacheDB.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.util.Properties;
2222
import java.util.concurrent.CompletableFuture;
2323
import java.util.concurrent.atomic.AtomicBoolean;
24+
import lombok.Getter;
25+
import lombok.Setter;
2426
import lombok.extern.slf4j.Slf4j;
2527
import org.apache.commons.lang3.ArrayUtils;
2628
import org.bouncycastle.util.encoders.Hex;
@@ -79,6 +81,10 @@ public class TxCacheDB implements DB<byte[], byte[]>, Flusher {
7981
private final Path cacheDir;
8082
private AtomicBoolean isValid = new AtomicBoolean(false);
8183

84+
@Getter
85+
@Setter
86+
private volatile boolean alive;
87+
8288
public TxCacheDB(String name, RecentTransactionStore recentTransactionStore) {
8389
this.name = name;
8490
this.TRANSACTION_COUNT =
@@ -138,6 +144,7 @@ private void initCache() {
138144
public void init() {
139145
if (recovery()) {
140146
isValid.set(true);
147+
setAlive(true);
141148
return;
142149
}
143150
long size = recentTransactionStore.size();
@@ -160,6 +167,7 @@ public void init() {
160167
bloomFilters[1].approximateElementCount(), bloomFilters[1].expectedFpp(),
161168
System.currentTimeMillis() - start);
162169
isValid.set(true);
170+
setAlive(true);
163171
}
164172

165173
@Override
@@ -247,10 +255,14 @@ public synchronized void flush(Map<WrappedByteArray, WrappedByteArray> batch) {
247255

248256
@Override
249257
public void close() {
258+
if (!isAlive()) {
259+
return;
260+
}
250261
dump();
251262
bloomFilters[0] = null;
252263
bloomFilters[1] = null;
253264
persistentStore.close();
265+
setAlive(false);
254266
}
255267

256268
@Override

chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -284,10 +284,6 @@ public synchronized void disable() {
284284

285285
@Override
286286
public void shutdown() {
287-
logger.info("******** Begin to pop revokingDb. ********");
288-
logger.info("******** Before revokingDb size: {}.", size);
289-
checkTmpStore.close();
290-
logger.info("******** End to pop revokingDb. ********");
291287
if (pruneCheckpointThread != null) {
292288
pruneCheckpointThread.shutdown();
293289
}

framework/src/main/java/org/tron/common/application/ApplicationImpl.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,13 @@ public void shutdown() {
7777
synchronized (dbManager.getRevokingStore()) {
7878
dbManager.getSession().reset();
7979
closeRevokingStore();
80-
closeAllStore();
8180
}
8281
dbManager.stopRePushThread();
8382
dbManager.stopRePushTriggerThread();
8483
EventPluginLoader.getInstance().stopPlugin();
8584
dbManager.stopFilterProcessThread();
85+
dbManager.stopValidateSignThread();
86+
getChainBaseManager().shutdown();
8687
dynamicArgs.close();
8788
logger.info("******** end to shutdown ********");
8889
}
@@ -112,8 +113,4 @@ private void closeRevokingStore() {
112113
dbManager.getRevokingStore().shutdown();
113114
}
114115

115-
private void closeAllStore() {
116-
dbManager.closeAllStore();
117-
}
118-
119116
}

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

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@
105105
import org.tron.core.db.api.MoveAbiHelper;
106106
import org.tron.core.db2.ISession;
107107
import org.tron.core.db2.core.Chainbase;
108-
import org.tron.core.db2.core.ITronChainBase;
109108
import org.tron.core.db2.core.SnapshotManager;
110109
import org.tron.core.exception.AccountResourceInsufficientException;
111110
import org.tron.core.exception.BadBlockException;
@@ -450,6 +449,10 @@ public void stopFilterProcessThread() {
450449
ExecutorServiceManager.shutdownAndAwaitTermination(filterEs, filterEsName);
451450
}
452451

452+
public void stopValidateSignThread() {
453+
ExecutorServiceManager.shutdownAndAwaitTermination(validateSignService, "validate-sign");
454+
}
455+
453456
@PostConstruct
454457
public void init() {
455458
ChainBaseManager.init(chainBaseManager);
@@ -1926,24 +1929,6 @@ public NullifierStore getNullifierStore() {
19261929
return chainBaseManager.getNullifierStore();
19271930
}
19281931

1929-
public void closeAllStore() {
1930-
logger.info("******** Begin to close db. ********");
1931-
chainBaseManager.closeAllStore();
1932-
validateSignService.shutdown();
1933-
logger.info("******** End to close db. ********");
1934-
}
1935-
1936-
public void closeOneStore(ITronChainBase database) {
1937-
logger.info("******** Begin to close {}. ********", database.getName());
1938-
try {
1939-
database.close();
1940-
} catch (Exception e) {
1941-
logger.info("Failed to close {}.", database.getName(), e);
1942-
} finally {
1943-
logger.info("******** End to close {}. ********", database.getName());
1944-
}
1945-
}
1946-
19471932
public boolean isTooManyPending() {
19481933
return getPendingTransactions().size() + getRePushTransactions().size()
19491934
> maxTransactionPendingSize;
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package org.tron.core.db;
2+
3+
import com.google.protobuf.InvalidProtocolBufferException;
4+
import java.io.IOException;
5+
import org.junit.AfterClass;
6+
import org.junit.Assert;
7+
import org.junit.BeforeClass;
8+
import org.junit.ClassRule;
9+
import org.junit.Rule;
10+
import org.junit.Test;
11+
import org.junit.rules.ExpectedException;
12+
import org.junit.rules.TemporaryFolder;
13+
import org.rocksdb.RocksDB;
14+
import org.tron.core.Constant;
15+
import org.tron.core.config.args.Args;
16+
import org.tron.core.exception.BadItemException;
17+
import org.tron.core.exception.ItemNotFoundException;
18+
19+
public class TronDatabaseTest extends TronDatabase<String> {
20+
21+
@ClassRule
22+
public static final TemporaryFolder temporaryFolder = new TemporaryFolder();
23+
24+
static {
25+
RocksDB.loadLibrary();
26+
}
27+
28+
@BeforeClass
29+
public static void initArgs() throws IOException {
30+
Args.setParam(new String[]{"-d", temporaryFolder.newFolder().toString()}, Constant.TEST_CONF);
31+
}
32+
33+
@AfterClass
34+
public static void destroy() {
35+
Args.clearParam();
36+
}
37+
38+
@Override
39+
public void put(byte[] key, String item) {
40+
41+
}
42+
43+
@Override
44+
public void delete(byte[] key) {
45+
46+
}
47+
48+
@Override
49+
public String get(byte[] key) {
50+
return "test";
51+
}
52+
53+
@Override
54+
public boolean has(byte[] key) {
55+
return false;
56+
}
57+
58+
@Rule
59+
public ExpectedException thrown = ExpectedException.none();
60+
61+
@Test
62+
public void TestInit() {
63+
TronDatabaseTest db = new TronDatabaseTest();
64+
Assert.assertNull(db.getDbSource());
65+
Assert.assertNull(db.getDbName());
66+
}
67+
68+
@Test
69+
public void TestIterator() {
70+
TronDatabaseTest db = new TronDatabaseTest();
71+
thrown.expect(UnsupportedOperationException.class);
72+
db.iterator();
73+
}
74+
75+
@Test
76+
public void TestIsNotEmpty() {
77+
TronDatabaseTest db = new TronDatabaseTest();
78+
thrown.expect(UnsupportedOperationException.class);
79+
db.isNotEmpty();
80+
}
81+
82+
@Test
83+
public void TestGetUnchecked() {
84+
TronDatabaseTest db = new TronDatabaseTest();
85+
Assert.assertNull(db.getUnchecked("test".getBytes()));
86+
}
87+
88+
@Test
89+
public void TestClose() {
90+
TronDatabaseTest db = new TronDatabaseTest();
91+
db.close();
92+
}
93+
94+
@Test
95+
public void TestGetFromRoot() throws
96+
InvalidProtocolBufferException, BadItemException, ItemNotFoundException {
97+
TronDatabaseTest db = new TronDatabaseTest();
98+
Assert.assertEquals(db.getFromRoot("test".getBytes()),
99+
"test");
100+
}
101+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public void reload() {
5151
DefaultListableBeanFactory defaultListableBeanFactory =
5252
(DefaultListableBeanFactory) context.getAutowireCapableBeanFactory();
5353
queryTransaction();
54+
db.close();
5455
defaultListableBeanFactory.destroySingleton("transactionCache");
5556
TransactionCache transactionCache = new TransactionCache("transactionCache",
5657
context.getBean(RecentTransactionStore.class));

0 commit comments

Comments
 (0)