peer update

git-svn-id: svn://db.shs.com.ru/pip@28 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
2015-03-16 14:49:23 +00:00
parent e50bedc5ef
commit 6498313fdd
6 changed files with 79 additions and 33 deletions

View File

@@ -213,8 +213,8 @@ void PIPeer::destroyMBcasts() {
PIPeer::PeerInfo * PIPeer::quickestPeer(const PIString & to) {
if (!peers_map.contains(to)) return 0;
//piCout << "*** search quickest peer" << to;
PIVector<PeerInfo * > tp = addresses_map[to];
PeerInfo * dp = 0;
PIVector<PeerInfo * > tp = addresses_map.value(to);
/*PeerInfo * dp = 0;
int mping = 0x7FFFFFFF;
for (int i = 0; i < tp.size_s(); ++i) {
int p = tp[i]->ping();
@@ -224,7 +224,9 @@ PIPeer::PeerInfo * PIPeer::quickestPeer(const PIString & to) {
}
}
//piCout << "*** search quickest peer: found" << (dp ? dp->name : "0");
return dp;
return dp;*/
if (tp.isEmpty()) return 0;
return tp.back();
}
@@ -388,6 +390,7 @@ bool PIPeer::mbcastRead(uchar * data, int size) {
pi.addNeighbour(self_info.name);
self_info.addNeighbour(pi.name);
}
pi.resetPing();
peers << pi;
buildMap();
//piCoutObj << "new peer \"" << pi.name << "\"" << " dist " << pi.dist;
@@ -459,6 +462,7 @@ bool PIPeer::mbcastRead(uchar * data, int size) {
}
if (exist || isRemoved(rpeer)) continue;
rpeer.dist++;
rpeer.resetPing();
peers << rpeer;
ch = true;
peerConnected(rpeer.name);
@@ -548,6 +552,7 @@ void PIPeer::pingNeighbours() {
if (a.wait_ping) {
if ((PISystemTime::current(true) - a.last_ping).abs().toSeconds() <= 5.)
continue;
a.ping = -1.;
}
a.wait_ping = true;
sba = ba;
@@ -604,20 +609,59 @@ void PIPeer::buildMap() {
//piCout << "[PIPeer \"" + name_ + "\"] buildMap";
peers_map.clear();
addresses_map.clear();
piForeach (PeerInfo & i, peers)
piForeach (PeerInfo & i, peers) {
i.trace = -1;
peers_map[i.name] = &i;
return;
int max_dist = -1;
PIMap<PIString, PeerInfo * > peers_;
}
PIVector<PeerInfo * > cwave, nwave;
int cwi = 0;
self_info.trace = 0;
cwave << &self_info;
while (!cwave.isEmpty()) {
nwave.clear();
++cwi;
piForeachC (PeerInfo * p, cwave) {
piForeachC (PIString & nn, p->neighbours) {
PeerInfo * np = peers_map.value(nn);
if (!np) continue;
if (np->trace >= 0) continue;
np->trace = cwi;
nwave << np;
}
}
cwave = nwave;
}
PIVector<PeerInfo * > cpath;
piForeach (PeerInfo & c, peers) {
cpath.clear();
cpath << &c;
cwave << &c;
for (int w = c.trace - 1; w >= 0; --w) {
nwave.clear();
piForeachC (PeerInfo * p, cwave) {
piForeachC (PIString & nn, p->neighbours) {
PeerInfo * np = peers_map.value(nn);
if (!np) continue;
if (np->trace != w) continue;
cpath << np;
nwave << np;
}
}
cwave = nwave;
}
addresses_map[c.name] = cpath;
//piCout << "map" << c.name << "=" << cpath;
}
/*int max_dist = -1;
self_info._nuses.resize(self_info.neighbours.size());
self_info._nuses.fill(0);
self_info._first = &self_info;
peers_[self_info.name] = &self_info;
peers_map[self_info.name] = &self_info;
piForeach (PeerInfo & i, peers) {
i._nuses.resize(i.neighbours.size());
i._nuses.fill(0);
i._first = 0;
peers_[i.name] = &i;
peers_map[i.name] = &i;
if (max_dist < i.dist)
max_dist = i.dist;
if (i.dist > 0) continue;
@@ -662,7 +706,7 @@ void PIPeer::buildMap() {
for (int n = 0; n < ns; ++n) {
if (p->_nuses[n] >= ns) continue;
p->_nuses[n]++;
npeer = peers_[p->neighbours[n]];
npeer = peers_map[p->neighbours[n]];
if (npeer == 0) continue;
if (d == 0) npeer->_first = npeer;
else {
@@ -684,7 +728,7 @@ void PIPeer::buildMap() {
if (!pl.contains(cwave[i]->_first))
pl << cwave[i]->_first;
}
}
}*/
/*piCout << " ** addresses map **";
piForeachC (napair & i, addresses_map)
piCout << i.first << i.second;