mirror of
https://github.com/monero-project/monero.git
synced 2025-08-03 00:16:08 -04:00
wallet_rpc_server: fix inconsistent wallet caches on reload
Loading the same wallet as the currently loaded one would autosave the current state after loading it, leading to some kind of rollback effect. We now save before loading to avoid this. If loading fails, it means the current wallet will be saved (or maybe not, depending on where the failure occurs: most of the sanity checks occur before saving). There is a new autosave_current flag to open/restore calls so the (enabled by default) autosave can be skipped.
This commit is contained in:
parent
9c77dbf376
commit
bcb86ae651
3 changed files with 78 additions and 46 deletions
|
@ -3111,6 +3111,18 @@ namespace tools
|
|||
er.message = "Invalid filename";
|
||||
return false;
|
||||
}
|
||||
if (m_wallet && req.autosave_current)
|
||||
{
|
||||
try
|
||||
{
|
||||
m_wallet->store();
|
||||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
std::string wallet_file = m_wallet_dir + "/" + req.filename;
|
||||
{
|
||||
po::options_description desc("dummy");
|
||||
|
@ -3141,6 +3153,16 @@ namespace tools
|
|||
}
|
||||
|
||||
if (m_wallet)
|
||||
delete m_wallet;
|
||||
m_wallet = wal.release();
|
||||
return true;
|
||||
}
|
||||
//------------------------------------------------------------------------------------------------------------------------------
|
||||
bool wallet_rpc_server::on_close_wallet(const wallet_rpc::COMMAND_RPC_CLOSE_WALLET::request& req, wallet_rpc::COMMAND_RPC_CLOSE_WALLET::response& res, epee::json_rpc::error& er, const connection_context *ctx)
|
||||
{
|
||||
if (!m_wallet) return not_open(er);
|
||||
|
||||
if (req.autosave_current)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -3151,24 +3173,6 @@ namespace tools
|
|||
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
|
||||
return false;
|
||||
}
|
||||
delete m_wallet;
|
||||
}
|
||||
m_wallet = wal.release();
|
||||
return true;
|
||||
}
|
||||
//------------------------------------------------------------------------------------------------------------------------------
|
||||
bool wallet_rpc_server::on_close_wallet(const wallet_rpc::COMMAND_RPC_CLOSE_WALLET::request& req, wallet_rpc::COMMAND_RPC_CLOSE_WALLET::response& res, epee::json_rpc::error& er, const connection_context *ctx)
|
||||
{
|
||||
if (!m_wallet) return not_open(er);
|
||||
|
||||
try
|
||||
{
|
||||
m_wallet->store();
|
||||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
|
||||
return false;
|
||||
}
|
||||
delete m_wallet;
|
||||
m_wallet = NULL;
|
||||
|
@ -3385,6 +3389,20 @@ namespace tools
|
|||
return false;
|
||||
}
|
||||
|
||||
if (m_wallet && req.autosave_current)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!wallet_file.empty())
|
||||
m_wallet->store();
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!req.spendkey.empty())
|
||||
|
@ -3433,19 +3451,7 @@ namespace tools
|
|||
}
|
||||
|
||||
if (m_wallet)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!wallet_file.empty())
|
||||
m_wallet->store();
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
|
||||
return false;
|
||||
}
|
||||
delete m_wallet;
|
||||
}
|
||||
m_wallet = wal.release();
|
||||
res.address = m_wallet->get_account().get_public_address_str(m_wallet->nettype());
|
||||
return true;
|
||||
|
@ -3511,6 +3517,18 @@ namespace tools
|
|||
return false;
|
||||
}
|
||||
}
|
||||
if (m_wallet && req.autosave_current)
|
||||
{
|
||||
try
|
||||
{
|
||||
m_wallet->store();
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// process seed_offset if given
|
||||
{
|
||||
|
@ -3621,18 +3639,7 @@ namespace tools
|
|||
}
|
||||
|
||||
if (m_wallet)
|
||||
{
|
||||
try
|
||||
{
|
||||
m_wallet->store();
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
|
||||
return false;
|
||||
}
|
||||
delete m_wallet;
|
||||
}
|
||||
m_wallet = wal.release();
|
||||
res.address = m_wallet->get_account().get_public_address_str(m_wallet->nettype());
|
||||
res.info = "Wallet has been restored successfully.";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue