Skip to content
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
6 changes: 5 additions & 1 deletion framework/src/main/java/org/tron/core/Wallet.java
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@
import org.tron.core.db.Manager;
import org.tron.core.db.TransactionContext;
import org.tron.core.db2.core.Chainbase;
import org.tron.core.db2.core.Chainbase.Cursor;
import org.tron.core.exception.AccountResourceInsufficientException;
import org.tron.core.exception.BadItemException;
import org.tron.core.exception.ContractExeException;
Expand Down Expand Up @@ -784,8 +785,11 @@ public WitnessList getPaginatedNowWitnessList(long offset, long limit) throws
In the maintenance period, the VoteStores will be cleared.
To avoid the race condition of VoteStores deleted but Witness vote counts not updated,
return retry error.
Only apply to requests that rely on the latest block,
which means the normal fullnode requests with HEAD cursor.
*/
if (chainBaseManager.getDynamicPropertiesStore().getStateFlag() == 1) {
boolean isMaintenance = chainBaseManager.getDynamicPropertiesStore().getStateFlag() == 1;
if (isMaintenance && !Args.getInstance().isSolidityNode() && getCursor() == Cursor.HEAD) {
String message =
"Service temporarily unavailable during maintenance period. Please try again later.";
throw new MaintenanceUnavailableException(message);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import org.tron.core.services.http.GetNodeInfoServlet;
import org.tron.core.services.http.GetNowBlockServlet;
import org.tron.core.services.http.GetPaginatedAssetIssueListServlet;
import org.tron.core.services.http.GetPaginatedNowWitnessListServlet;
import org.tron.core.services.http.GetRewardServlet;
import org.tron.core.services.http.GetTransactionCountByBlockNumServlet;
import org.tron.core.services.http.GetTransactionInfoByBlockNumServlet;
Expand Down Expand Up @@ -92,6 +93,8 @@ public class SolidityNodeHttpApiService extends HttpService {
@Autowired
private ListWitnessesServlet listWitnessesServlet;
@Autowired
private GetPaginatedNowWitnessListServlet getPaginatedNowWitnessListServlet;
@Autowired
private GetAssetIssueListServlet getAssetIssueListServlet;
@Autowired
private GetPaginatedAssetIssueListServlet getPaginatedAssetIssueListServlet;
Expand Down Expand Up @@ -174,6 +177,8 @@ protected void addServlet(ServletContextHandler context) {
// same as FullNode
context.addServlet(new ServletHolder(getAccountServlet), "/walletsolidity/getaccount");
context.addServlet(new ServletHolder(listWitnessesServlet), "/walletsolidity/listwitnesses");
context.addServlet(new ServletHolder(getPaginatedNowWitnessListServlet),
"/walletsolidity/getpaginatednowwitnesslist");
context.addServlet(new ServletHolder(getAssetIssueListServlet),
"/walletsolidity/getassetissuelist");
context.addServlet(new ServletHolder(getPaginatedAssetIssueListServlet),
Expand Down
15 changes: 15 additions & 0 deletions framework/src/test/java/org/tron/core/WalletTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
import org.tron.core.capsule.VotesCapsule;
import org.tron.core.capsule.WitnessCapsule;
import org.tron.core.config.args.Args;
import org.tron.core.db2.core.Chainbase;
import org.tron.core.exception.ContractExeException;
import org.tron.core.exception.ContractValidateException;
import org.tron.core.exception.MaintenanceUnavailableException;
Expand Down Expand Up @@ -867,6 +868,20 @@ public void testGetPaginatedNowWitnessList_Error() {
Assert.assertTrue("Should throw MaintenanceClearingException",
e instanceof MaintenanceUnavailableException);
}

try {
Args.getInstance().setSolidityNode(true);
wallet.getPaginatedNowWitnessList(0, 10);
Args.getInstance().setSolidityNode(false);

dbManager.setCursor(Chainbase.Cursor.SOLIDITY);
wallet.getPaginatedNowWitnessList(0, 10);
dbManager.setCursor(Chainbase.Cursor.HEAD);
} catch (Exception e) {
Assert.assertFalse("Should not throw MaintenanceClearingException",
e instanceof MaintenanceUnavailableException);
}

dbManager.getChainBaseManager().getDynamicPropertiesStore().saveStateFlag(0);
}

Expand Down