aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDion Ahmetaj <ahmetajd@coned.com>2016-10-07 16:19:33 -0400
committerDion Ahmetaj <ahmetajd@coned.com>2016-11-18 13:40:55 -0500
commitfd181b03bb58a8b0628d2af8637cf6bb968fc437 (patch)
tree69a271609481c51110a3fd9c8cc3a1c49d163d8a /src
parentMerge pull request #1346 (diff)
downloadmonero-fd181b03bb58a8b0628d2af8637cf6bb968fc437.tar.xz
Clamp refresh from height to blockchain height.
Diffstat (limited to 'src')
-rw-r--r--src/wallet/wallet2.cpp112
1 files changed, 69 insertions, 43 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 15a134257..57a9cff99 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -1574,12 +1574,35 @@ void wallet2::refresh(uint64_t start_height, uint64_t & blocks_fetched, bool& re
std::list<cryptonote::block_complete_entry> blocks;
std::vector<COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> o_indices;
+ std::string daemon_height_err = "";
+ uint64_t daemon_bc_height = get_daemon_blockchain_height(daemon_height_err);
+ if(daemon_height_err.size() > 0) {
+ throw std::runtime_error(daemon_height_err);
+ }
+
// pull the first set of blocks
get_short_chain_history(short_chain_history);
m_run.store(true, std::memory_order_relaxed);
if (start_height > m_blockchain.size() || m_refresh_from_block_height > m_blockchain.size()) {
- if (!start_height)
- start_height = m_refresh_from_block_height;
+
+ // even target_height can be zero if the daemon just started and hasn't gotten some sync
+ // data back from peers .. hmmm, what to do ... O.o (you can see him thinking)
+ // i'm going with infiniti loop until i get something bigger than zero or err ... moneromoo don't kill me
+ std::string daemon_target_err = "";
+ uint64_t daemon_target_height = 0;
+
+ while(daemon_target_height == 0)
+ {
+ daemon_target_height = get_daemon_blockchain_target_height(daemon_target_err);
+ if(daemon_target_err.size() > 0) {
+ daemon_target_height = get_approximate_blockchain_height(); // - x?
+ }
+ }
+
+ if (m_refresh_from_block_height > daemon_target_height) m_refresh_from_block_height = daemon_target_height - 1;
+ if (!start_height) start_height = m_refresh_from_block_height;
+ if (start_height >= daemon_bc_height) start_height = daemon_bc_height - 1;
+
// we can shortcut by only pulling hashes up to the start_height
fast_refresh(start_height, blocks_start_height, short_chain_history);
// regenerate the history now that we've got a full set of hashes
@@ -1589,53 +1612,56 @@ void wallet2::refresh(uint64_t start_height, uint64_t & blocks_fetched, bool& re
// and then fall through to regular refresh processing
}
- pull_blocks(start_height, blocks_start_height, short_chain_history, blocks, o_indices);
- // always reset start_height to 0 to force short_chain_ history to be used on
- // subsequent pulls in this refresh.
- start_height = 0;
-
- while(m_run.load(std::memory_order_relaxed))
+ if(!(m_refresh_from_block_height >= daemon_bc_height))
{
- try
- {
- // pull the next set of blocks while we're processing the current one
- uint64_t next_blocks_start_height;
- std::list<cryptonote::block_complete_entry> next_blocks;
- std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> next_o_indices;
- bool error = false;
- pull_thread = boost::thread([&]{pull_next_blocks(start_height, next_blocks_start_height, short_chain_history, blocks, next_blocks, next_o_indices, error);});
-
- process_blocks(blocks_start_height, blocks, o_indices, added_blocks);
- blocks_fetched += added_blocks;
- pull_thread.join();
- if(!added_blocks)
- break;
-
- // switch to the new blocks from the daemon
- blocks_start_height = next_blocks_start_height;
- blocks = next_blocks;
- o_indices = next_o_indices;
+ pull_blocks(start_height, blocks_start_height, short_chain_history, blocks, o_indices);
+ // always reset start_height to 0 to force short_chain_ history to be used on
+ // subsequent pulls in this refresh.
+ start_height = 0;
- // handle error from async fetching thread
- if (error)
- {
- throw std::runtime_error("proxy exception in refresh thread");
- }
- }
- catch (const std::exception&)
+ while(m_run.load(std::memory_order_relaxed))
{
- blocks_fetched += added_blocks;
- if (pull_thread.joinable())
- pull_thread.join();
- if(try_count < 3)
+ try
{
- LOG_PRINT_L1("Another try pull_blocks (try_count=" << try_count << ")...");
- ++try_count;
+ // pull the next set of blocks while we're processing the current one
+ uint64_t next_blocks_start_height;
+ std::list<cryptonote::block_complete_entry> next_blocks;
+ std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> next_o_indices;
+ bool error = false;
+ pull_thread = boost::thread([&]{pull_next_blocks(start_height, next_blocks_start_height, short_chain_history, blocks, next_blocks, next_o_indices, error);});
+
+ process_blocks(blocks_start_height, blocks, o_indices, added_blocks);
+ blocks_fetched += added_blocks;
+ pull_thread.join();
+ if(!added_blocks)
+ break;
+
+ // switch to the new blocks from the daemon
+ blocks_start_height = next_blocks_start_height;
+ blocks = next_blocks;
+ o_indices = next_o_indices;
+
+ // handle error from async fetching thread
+ if (error)
+ {
+ throw std::runtime_error("proxy exception in refresh thread");
+ }
}
- else
+ catch (const std::exception&)
{
- LOG_ERROR("pull_blocks failed, try_count=" << try_count);
- throw;
+ blocks_fetched += added_blocks;
+ if (pull_thread.joinable())
+ pull_thread.join();
+ if(try_count < 3)
+ {
+ LOG_PRINT_L1("Another try pull_blocks (try_count=" << try_count << ")...");
+ ++try_count;
+ }
+ else
+ {
+ LOG_ERROR("pull_blocks failed, try_count=" << try_count);
+ throw;
+ }
}
}
}