Skip to content

Commit

Permalink
Merge pull request #168 from adshares/merge-esc
Browse files Browse the repository at this point in the history
Merge esc
  • Loading branch information
jzemlo authored Sep 27, 2018
2 parents 8acab18 + aa041c0 commit fdb7a1d
Show file tree
Hide file tree
Showing 10 changed files with 155 additions and 117 deletions.
9 changes: 8 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.0.2] - 2018-09-27
### Fixed
- Node did not stop when there was not enough signatures
- Improved peer discovery
- On rare occasions node could suddenly stop all peer communication [#151](https://github.com/adshares/ads/issues/151)

## [1.0.1] - 2018-09-20
### Changed
- New log format
Expand Down Expand Up @@ -48,8 +54,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Update default parameters
- Creating a dev version with reference to the last tag

[Unreleased]: https://github.com/adshares/ads/compare/v1.0.1...HEAD
[Unreleased]: https://github.com/adshares/ads/compare/v1.0.2...HEAD

[1.0.2]: https://github.com/adshares/ads/compare/v1.0.1...v1.0.2
[1.0.1]: https://github.com/adshares/ads/compare/v1.0.0...v1.0.1
[1.0.0]: https://github.com/adshares/ads/compare/v0.0.6...v1.0.0
[0.0.6]: https://github.com/adshares/ads/compare/v0.0.5...v0.0.6
Expand Down
6 changes: 4 additions & 2 deletions src/common/helper/filewrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@ FileWrapper::FileWrapper(const std::string filepath, int mask, bool removeOnClos

FileWrapper::~FileWrapper()
{
close(m_file_descriptor);
m_file_descriptor = -1;
if (m_file_descriptor != -1) {
close(m_file_descriptor);
m_file_descriptor = -1;
}
if (m_remove_on_close) {
remove();
}
Expand Down
2 changes: 2 additions & 0 deletions src/common/servers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1696,6 +1696,8 @@ class servers { // also a block
//change log directory
logging::change_log_file(now);
//FIXME, update VIP status now
vok=0;
vno=0;
update_vipstatus();
msg=0;
txs=0;
Expand Down
3 changes: 2 additions & 1 deletion src/common/settings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -235,8 +235,9 @@ class settings {
while (1) {
ch = utils::getch();
if (ch == '\n') break;
if (print_char != 0)
if (print_char != 0) {
std::cout<<print_char;
}
pass.push_back(ch);
}
if (print_char != 0)
Expand Down
8 changes: 4 additions & 4 deletions src/default_ads.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
#define MAX_MSGWAIT 0x2 /* start with 2 and change to 8: wait no more than 8s for a message */
#define VOTE_DELAY 2 /*increase later (maybe monitor network delay)!!!*/
#define VIP_MAX 7 /* maximum number of VIP servers */
#define MIN_PEERS 8 /* keep at least 3 peers connected */
#define MAX_PEERS 16 /* keep not more than 8 peers connected */
#define MIN_PEERS 8 /* keep at least N peers connected */
#define MAX_PEERS 16 /* keep not more than N peers connected */
#define VALIDATORS 8 /* number of validator threads */
#define CLIENT_POOL 16 /* do not offer more threads that are used for network message validation */
#define USER_MIN_AGE (BLOCKSEC*2)
Expand All @@ -30,8 +30,8 @@
#define MAX_MSGWAIT 0x10 /* wait no more than 16s for a message */
#define VOTE_DELAY 4 /*increase later (maybe monitor network delay)!!!*/
#define VIP_MAX 31 /* maximum number of VIP servers */
#define MIN_PEERS 8 /* keep at least 8 peers connected */
#define MAX_PEERS 16 /* keep not more than 16 peers connected */
#define MIN_PEERS 16 /* keep at least N peers connected */
#define MAX_PEERS 48 /* keep not more than N peers connected */
#define VALIDATORS 8 /* number of validator threads */
#define CLIENT_POOL 16 /* do not offer more threads that are used for network message validation */
#define USER_MIN_AGE (BLOCKSEC*10000L) /* wait at least 10000 blocks before deleting an account */
Expand Down
3 changes: 2 additions & 1 deletion src/escd/client.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class client : public boost::enable_shared_from_this<client> {

m_offi.leave(shared_from_this());
DLOG("CLIENT: timeout %s:%s\n",m_addr.c_str(),m_port.c_str());
m_socket.cancel();
});
}

Expand Down Expand Up @@ -106,7 +107,7 @@ class client : public boost::enable_shared_from_this<client> {

void handle_read_txstype(const boost::system::error_code& error) {
if(error) {
DLOG("ERROR: read txstype error\n");
// DLOG("ERROR: read txstype error\n");
m_offi.leave(shared_from_this());
return;
}
Expand Down
185 changes: 104 additions & 81 deletions src/escd/network/peerclientmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ PeerConnectManager::~PeerConnectManager()

void PeerConnectManager::startConnect()
{
DLOG("PEER_MANAGER START CONNECT\n");
timerNextTick(1);
}

Expand Down Expand Up @@ -73,37 +74,47 @@ void PeerConnectManager::startAccept()

void PeerConnectManager::peerAccept(boost::shared_ptr<peer> new_peer, const boost::system::error_code& error)
{
DLOG("PEER ACCEPT %04X\n", new_peer->svid);
if(m_peers.size() >= MAX_PEERS) {
ILOG("%04X PEER DROPPED, max connections reached\n", new_peer->svid);
new_peer->leave();
} else {
DLOG("PEER ACCEPT %04X\n", new_peer->svid);

uint32_t now = time(NULL);
auto address = new_peer->socket().remote_endpoint().address().to_string();
auto port = new_peer->socket().remote_endpoint().port();
in_addr_t addr = inet_addr(address.c_str());
uint32_t now = time(NULL);
auto address = new_peer->socket().remote_endpoint().address().to_string();
auto port = new_peer->socket().remote_endpoint().port();
in_addr_t addr = inet_addr(address.c_str());

if (now>= m_server.srvs_now()+BLOCKSEC || error || alreadyConnected(addr, port, new_peer->svid) )
{
new_peer->leave();
WLOG("WARNING: dropping connection %d\n", new_peer->svid);
}
else
{
new_peer->accept();
if (now>= m_server.srvs_now()+BLOCKSEC || error || alreadyConnected(addr, port, new_peer->svid) )
{
new_peer->leave();
WLOG("WARNING: dropping connection %d\n", new_peer->svid);
}
else
{
new_peer->accept();

boost::upgrade_lock< boost::shared_mutex > lock(m_peerMx);
m_peers[std::make_pair(addr, port)] = new_peer;
DLOG("PEER ACCEPT inet addr %s port: %d \n", address.c_str(), port);
boost::upgrade_lock< boost::shared_mutex > lock(m_peerMx);
m_peers[std::make_pair(addr, port)] = new_peer;
DLOG("PEER ACCEPT inet addr %s port: %d \n", address.c_str(), port);
}
}

startAccept();
}

void PeerConnectManager::ioRun()
{
try {
m_ioService.run();
} //Now we know the server is down.
catch (std::exception& e) {
ELOG("Server.Run error: %s\n",e.what());
for (;;)
{
try {
m_ioService.run();
break; // run exited normally
} //Now we know the server is down.
catch (std::exception& e) {
WLOG("Server.Run error: %s\n",e.what());
RETURN_ON_SHUTDOWN();
}
}
}

Expand Down Expand Up @@ -266,92 +277,81 @@ void PeerConnectManager::connect(std::string peer_address, unsigned short port,
}


void PeerConnectManager::connectPeersFromConfig(int& connNeeded)
void PeerConnectManager::getPeersFromConfig(std::vector<std::pair<in_addr_t, unsigned short>> &peerAddrs)
{
for(std::string addr : m_opts.peer)
for(std::string address : m_opts.peer)
{
if(connNeeded <= 0){
break;
}

std::string peer_address;
std::string port;
std::string svid;
in_addr addr;

m_opts.get_address(address, peer_address, port, svid);

if(inet_aton(peer_address.c_str(), &addr) != 0 ){
peerAddrs.push_back(std::make_pair(addr.s_addr, atol(port.c_str())));
} else {
boost::asio::ip::tcp::resolver resolver(m_ioService);
boost::asio::ip::tcp::resolver::query query(peer_address.c_str(),SERVER_PORT);
boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
boost::asio::ip::tcp::resolver::iterator end;

m_opts.get_address(addr, peer_address, port, svid);

connect(peer_address, atoi(port.c_str()), atoi(svid.c_str()));
--connNeeded;
if(iterator != end && inet_aton(iterator->endpoint().address().to_string().c_str(), &addr) != 0)
{
peerAddrs.push_back(std::make_pair(addr.s_addr, atol(port.c_str())));
}
}
}
}

void PeerConnectManager::connectPeersFromDNS(int& connNeeded)
void PeerConnectManager::getPeersFromDNS(std::vector<std::pair<in_addr_t, unsigned short>> &peerAddrs)
{
try
{
boost::asio::ip::tcp::resolver resolver(m_ioService);
boost::asio::ip::tcp::resolver::query query(m_opts.dnsa.c_str(),SERVER_PORT);
boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
boost::asio::ip::tcp::resolver::iterator end;
std::map<uint32_t,boost::asio::ip::tcp::resolver::iterator> endpoints;

while(iterator != end)
{
uint32_t r=random()%0xFFFFFFFF;
endpoints[r]=iterator++;
}
auto addr = iterator->endpoint().address().to_string();
auto port = iterator->endpoint().port();

for(auto ep=endpoints.begin(); ep!=endpoints.end(); ep++)
{
if(connNeeded <= 0){
break;
in_addr inaddr;
if(inet_aton(addr.c_str(), &inaddr) != 0){
peerAddrs.push_back(std::make_pair(inaddr.s_addr, port));
}

connect(ep->second->endpoint(), BANK_MAX);
--connNeeded;
++iterator;
}
}
catch (std::exception& e) {
ELOG("DNS Connect Exception: %s\n", e.what());
}
}

void PeerConnectManager::connectPeersFromServerFile(int& connNeeded)
void PeerConnectManager::getPeersFromServerFile(std::vector<std::pair<in_addr_t, unsigned short>> &peerAddrs)
{
while(connNeeded>0)
{
bool foundNew{false};
node nodeInfo;
uint16_t nodeIndx = m_server.getRandomNodeIndx();
uint16_t maxNodeIndx = m_server.getMaxNodeIndx();

if(maxNodeIndx == 0){
assert(maxNodeIndx != 0);
ELOG("maxNodeIndx == 0, returning\n");
return;
}
node nodeInfo;
uint16_t maxNodeIndx = m_server.getMaxNodeIndx();

if(maxNodeIndx == 0){
assert(maxNodeIndx != 0);
ELOG("maxNodeIndx == 0, returning\n");
return;
}

//@TODO: improve efficiency of finding new node
for(int i = 0; i<=maxNodeIndx; ++i)
//@TODO: improve efficiency of finding new node
for(int i = 0; i<=maxNodeIndx; ++i)
{
//Don't connect to myself
if(i != m_opts.svid && m_server.getNode(i, nodeInfo))
{
//Don't connect to myself
if(nodeIndx != m_opts.svid && m_server.getNode(nodeIndx, nodeInfo))
{
if(nodeInfo.port > 0
&& m_peers.find(std::make_pair(nodeInfo.ipv4, nodeInfo.port)) == m_peers.end() )
{
foundNew = true;
break;
}
if(nodeInfo.mtim >= m_server.last_srvs_.now - BLOCKSEC*BLOCKDIV) {
peerAddrs.push_back(std::make_pair(nodeInfo.ipv4, static_cast<unsigned short>(nodeInfo.port)));
}

nodeIndx = (nodeIndx+1)%(maxNodeIndx+1);
}

if(foundNew){
connect(nodeInfo, nodeIndx);
}
--connNeeded;
}
}

Expand All @@ -369,22 +369,45 @@ void PeerConnectManager::connectPeers(const boost::system::error_code& error)
return;
}

int neededPeers = MAX_PEERS - m_peers.size();
int neededPeers = MIN_PEERS - m_peers.size();
neededPeers = neededPeers > MAX_INIT_CONN ? MAX_INIT_CONN : neededPeers;

DLOG("Need %d peers\n", neededPeers);

//@TODO: ADD check if we cannot access any server.
//In this case SHUTDOWN_AND_RETURN() should be called
if(!error && neededPeers > 0)
{
if( (m_sourceCounter++)%10 <= 1) {
connectPeersFromConfig(neededPeers);
}
std::vector<std::pair<in_addr_t, unsigned short>> peerAddrs;

if(!m_opts.init){
connectPeersFromDNS(neededPeers);
}
getPeersFromConfig(peerAddrs);
getPeersFromDNS(peerAddrs);
getPeersFromServerFile(peerAddrs);

DLOG("Available peers: %d\n", peerAddrs.size());

if(peerAddrs.size() > 0) {
for(unsigned int i=0; i<peerAddrs.size() && neededPeers > 0; i++) {
int inx = random()%peerAddrs.size();
auto peer = peerAddrs[inx];

connectPeersFromServerFile(neededPeers);
if(peer.second > 0 && m_peers.find(peer) == m_peers.end() )
{
DLOG("Selected peer %d. addr %d, port %d\n", inx, peer.first, peer.second);
in_addr addr;
addr.s_addr = peer.first;
connect(addr, peer.second, BANK_MAX);
peerAddrs[inx].second=0;
neededPeers--;
} else {
if(peer.second > 0) {
DLOG("Selected peer already connected\n");
}
}
}
} else {
ELOG("No peers available. Update your config file.\n");
}
}

timerNextTick(m_timeout);
Expand Down
7 changes: 3 additions & 4 deletions src/escd/network/peerclientmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,11 @@ class PeerConnectManager
/** Request connect to new peers if needed from options, dns and nodes form server.srv */
void connectPeers(const boost::system::error_code& error);
/** Connect to peer from server.srv */
void connectPeersFromServerFile(int& connNeeded);
void getPeersFromServerFile(std::vector<std::pair<in_addr_t, unsigned short>> &peerAddrs);
/** Connect to peer from options.cfg */
void connectPeersFromConfig(int& connNeeded);
void getPeersFromConfig(std::vector<std::pair<in_addr_t, unsigned short>> &peerAddrs);
/** Connect to peer from DNS */
void connectPeersFromDNS(int& connNeeded);
void getPeersFromDNS(std::vector<std::pair<in_addr_t, unsigned short>> &peerAddrs);

/** Accept new peer */
void peerAccept(boost::shared_ptr<peer> new_peer, const boost::system::error_code& error);
Expand Down Expand Up @@ -133,7 +133,6 @@ class PeerConnectManager
uint8_t m_timeout{DEF_CONN_ATTEMPT_PERIOD};
boost::thread_attributes m_threadAttributes;
std::unique_ptr<boost::thread> m_ioThread;
unsigned int m_sourceCounter{0}; ///< counter which helper to randomlly connect to diffrent peer source (dns, config...)
};

#endif // PEERCLIENTMANAGER_HPP
Loading

0 comments on commit fdb7a1d

Please sign in to comment.