Skip to content

feat(db):tune the databases closure #5429

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 4 additions & 54 deletions chainbase/src/main/java/org/tron/core/ChainBaseManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@
import org.tron.core.db.PbftSignDataStore;
import org.tron.core.db.RecentBlockStore;
import org.tron.core.db.RecentTransactionStore;
import org.tron.core.db.TransactionCache;
import org.tron.core.db.TransactionStore;
import org.tron.core.db2.core.ITronChainBase;
import org.tron.core.exception.BadItemException;
import org.tron.core.exception.HeaderNotFound;
import org.tron.core.exception.ItemNotFoundException;
Expand Down Expand Up @@ -238,9 +236,6 @@ public class ChainBaseManager {
@Autowired
private DbStatService dbStatService;

@Autowired
private TransactionCache transactionCache;

@Getter
@Setter
private NodeType nodeType;
Expand All @@ -249,55 +244,6 @@ public class ChainBaseManager {
@Setter
private long lowestBlockNum = -1; // except num = 0.

public void closeOneStore(ITronChainBase database) {
logger.info("******** Begin to close {}. ********", database.getName());
try {
database.close();
} catch (Exception e) {
logger.info("Failed to close {}.", database.getName(), e);
} finally {
logger.info("******** End to close {}. ********", database.getName());
}
}

public void closeAllStore() {
dbStatService.shutdown();
closeOneStore(transactionRetStore);
closeOneStore(recentBlockStore);
closeOneStore(transactionHistoryStore);
closeOneStore(transactionStore);
closeOneStore(accountStore);
closeOneStore(blockStore);
closeOneStore(blockIndexStore);
closeOneStore(accountIdIndexStore);
closeOneStore(accountIndexStore);
closeOneStore(witnessScheduleStore);
closeOneStore(assetIssueStore);
closeOneStore(dynamicPropertiesStore);
closeOneStore(abiStore);
closeOneStore(codeStore);
closeOneStore(contractStore);
closeOneStore(contractStateStore);
closeOneStore(storageRowStore);
closeOneStore(exchangeStore);
closeOneStore(proposalStore);
closeOneStore(votesStore);
closeOneStore(delegatedResourceStore);
closeOneStore(delegatedResourceAccountIndexStore);
closeOneStore(assetIssueV2Store);
closeOneStore(exchangeV2Store);
closeOneStore(nullifierStore);
closeOneStore(merkleTreeStore);
closeOneStore(delegationStore);
closeOneStore(proofStore);
closeOneStore(commonStore);
closeOneStore(commonDataBase);
closeOneStore(pbftSignDataStore);
closeOneStore(sectionBloomStore);
closeOneStore(accountAssetStore);
closeOneStore(transactionCache);
}

// for test only
public List<ByteString> getWitnesses() {
return witnessScheduleStore.getActiveWitnesses();
Expand Down Expand Up @@ -437,6 +383,10 @@ private void init() {
this.nodeType = getLowestBlockNum() > 1 ? NodeType.LITE : NodeType.FULL;
}

public void shutdown() {
dbStatService.shutdown();
}

public boolean isLiteNode() {
return getNodeType() == NodeType.LITE;
}
Expand Down
9 changes: 8 additions & 1 deletion chainbase/src/main/java/org/tron/core/db/TronDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,14 @@ public void reset() {
*/
@Override
public void close() {
dbSource.closeDB();
logger.info("******** Begin to close {}. ********", getName());
try {
dbSource.closeDB();
} catch (Exception e) {
logger.warn("Failed to close {}.", getName(), e);
} finally {
logger.info("******** End to close {}. ********", getName());
}
}

public abstract void put(byte[] key, T item);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,14 @@ public String getName() {

@Override
public void close() {
revokingDB.close();
logger.info("******** Begin to close {}. ********", getName());
try {
revokingDB.close();
} catch (Exception e) {
logger.warn("Failed to close {}.", getName(), e);
} finally {
logger.info("******** End to close {}. ********", getName());
}
}

@Override
Expand Down
12 changes: 12 additions & 0 deletions chainbase/src/main/java/org/tron/core/db2/common/TxCacheDB.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import java.util.Properties;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.bouncycastle.util.encoders.Hex;
Expand Down Expand Up @@ -79,6 +81,10 @@ public class TxCacheDB implements DB<byte[], byte[]>, Flusher {
private final Path cacheDir;
private AtomicBoolean isValid = new AtomicBoolean(false);

@Getter
@Setter
private volatile boolean alive;

public TxCacheDB(String name, RecentTransactionStore recentTransactionStore) {
this.name = name;
this.TRANSACTION_COUNT =
Expand Down Expand Up @@ -138,6 +144,7 @@ private void initCache() {
public void init() {
if (recovery()) {
isValid.set(true);
setAlive(true);
return;
}
long size = recentTransactionStore.size();
Expand All @@ -160,6 +167,7 @@ public void init() {
bloomFilters[1].approximateElementCount(), bloomFilters[1].expectedFpp(),
System.currentTimeMillis() - start);
isValid.set(true);
setAlive(true);
}

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

@Override
public void close() {
if (!isAlive()) {
return;
}
dump();
bloomFilters[0] = null;
bloomFilters[1] = null;
persistentStore.close();
setAlive(false);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,10 +284,6 @@ public synchronized void disable() {

@Override
public void shutdown() {
logger.info("******** Begin to pop revokingDb. ********");
logger.info("******** Before revokingDb size: {}.", size);
checkTmpStore.close();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why should remove the logs and the operation closing checkTmpStore?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to DisposableBeanAdapter.inferDestroyMethodIfNecessary:

If the current value of the given beanDefinition's "destroyMethodName" property is AbstractBeanDefinition.INFER_METHOD, then attempt to infer a destroy method. Candidate methods are currently limited to public, no-arg methods named "close" or "shutdown" (whether declared locally or inherited). The given BeanDefinition's "destroyMethodName" is updated to be null if no such method is found, otherwise set to the name of the inferred method. This constant serves as the default for the @bean#destroyMethod attribute and the value of the constant may also be used in XML within the or attributes.
Also processes the java.io.Closeable and AutoCloseable interfaces, reflectively calling the "close" method on implementing beans as well.

checkTmpStore implements AutoCloseable, will be auto-closed.

logger.info("******** End to pop revokingDb. ********");
if (pruneCheckpointThread != null) {
pruneCheckpointThread.shutdown();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,13 @@ public void shutdown() {
synchronized (dbManager.getRevokingStore()) {
dbManager.getSession().reset();
closeRevokingStore();
closeAllStore();
}
dbManager.stopRePushThread();
dbManager.stopRePushTriggerThread();
EventPluginLoader.getInstance().stopPlugin();
dbManager.stopFilterProcessThread();
dbManager.stopValidateSignThread();
getChainBaseManager().shutdown();
dynamicArgs.close();
logger.info("******** end to shutdown ********");
FullNode.shutDownSign = true;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this shutDownSign assign move to dbmanager.stopValidateSignThread?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It will be solved here #5433 .

Expand Down Expand Up @@ -115,8 +116,4 @@ private void closeRevokingStore() {
dbManager.getRevokingStore().shutdown();
}

private void closeAllStore() {
dbManager.closeAllStore();
}

}
23 changes: 4 additions & 19 deletions framework/src/main/java/org/tron/core/db/Manager.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,6 @@
import org.tron.core.db.api.MoveAbiHelper;
import org.tron.core.db2.ISession;
import org.tron.core.db2.core.Chainbase;
import org.tron.core.db2.core.ITronChainBase;
import org.tron.core.db2.core.SnapshotManager;
import org.tron.core.exception.AccountResourceInsufficientException;
import org.tron.core.exception.BadBlockException;
Expand Down Expand Up @@ -450,6 +449,10 @@ public void stopFilterProcessThread() {
ExecutorServiceManager.shutdownAndAwaitTermination(filterEs, filterEsName);
}

public void stopValidateSignThread() {
ExecutorServiceManager.shutdownAndAwaitTermination(validateSignService, "validate-sign");
}

@PostConstruct
public void init() {
ChainBaseManager.init(chainBaseManager);
Expand Down Expand Up @@ -1926,24 +1929,6 @@ public NullifierStore getNullifierStore() {
return chainBaseManager.getNullifierStore();
}

public void closeAllStore() {
logger.info("******** Begin to close db. ********");
chainBaseManager.closeAllStore();
validateSignService.shutdown();
logger.info("******** End to close db. ********");
}

public void closeOneStore(ITronChainBase database) {
logger.info("******** Begin to close {}. ********", database.getName());
try {
database.close();
} catch (Exception e) {
logger.info("Failed to close {}.", database.getName(), e);
} finally {
logger.info("******** End to close {}. ********", database.getName());
}
}

public boolean isTooManyPending() {
return getPendingTransactions().size() + getRePushTransactions().size()
> maxTransactionPendingSize;
Expand Down
101 changes: 101 additions & 0 deletions framework/src/test/java/org/tron/core/db/TronDatabaseTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package org.tron.core.db;

import com.google.protobuf.InvalidProtocolBufferException;
import java.io.IOException;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import org.rocksdb.RocksDB;
import org.tron.core.Constant;
import org.tron.core.config.args.Args;
import org.tron.core.exception.BadItemException;
import org.tron.core.exception.ItemNotFoundException;

public class TronDatabaseTest extends TronDatabase<String> {

@ClassRule
public static final TemporaryFolder temporaryFolder = new TemporaryFolder();

static {
RocksDB.loadLibrary();
}

@BeforeClass
public static void initArgs() throws IOException {
Args.setParam(new String[]{"-d", temporaryFolder.newFolder().toString()}, Constant.TEST_CONF);
}

@AfterClass
public static void destroy() {
Args.clearParam();
}

@Override
public void put(byte[] key, String item) {

}

@Override
public void delete(byte[] key) {

}

@Override
public String get(byte[] key) {
return "test";
}

@Override
public boolean has(byte[] key) {
return false;
}

@Rule
public ExpectedException thrown = ExpectedException.none();

@Test
public void TestInit() {
TronDatabaseTest db = new TronDatabaseTest();
Assert.assertNull(db.getDbSource());
Assert.assertNull(db.getDbName());
}

@Test
public void TestIterator() {
TronDatabaseTest db = new TronDatabaseTest();
thrown.expect(UnsupportedOperationException.class);
db.iterator();
}

@Test
public void TestIsNotEmpty() {
TronDatabaseTest db = new TronDatabaseTest();
thrown.expect(UnsupportedOperationException.class);
db.isNotEmpty();
}

@Test
public void TestGetUnchecked() {
TronDatabaseTest db = new TronDatabaseTest();
Assert.assertNull(db.getUnchecked("test".getBytes()));
}

@Test
public void TestClose() {
TronDatabaseTest db = new TronDatabaseTest();
db.close();
}

@Test
public void TestGetFromRoot() throws
InvalidProtocolBufferException, BadItemException, ItemNotFoundException {
TronDatabaseTest db = new TronDatabaseTest();
Assert.assertEquals(db.getFromRoot("test".getBytes()),
"test");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public void reload() {
DefaultListableBeanFactory defaultListableBeanFactory =
(DefaultListableBeanFactory) context.getAutowireCapableBeanFactory();
queryTransaction();
db.close();
defaultListableBeanFactory.destroySingleton("transactionCache");
TransactionCache transactionCache = new TransactionCache("transactionCache",
context.getBean(RecentTransactionStore.class));
Expand Down