independent cache for each IRC client

pull/14/head
Tom Early 6 years ago
parent f949bb5234
commit 18c511c8f6

@ -124,10 +124,7 @@ void CCacheManager::updateUser(const std::string &user, const std::string &rptr,
if (rptr.compare(0, 7, gate, 0, 7)) if (rptr.compare(0, 7, gate, 0, 7))
RptrGate[rptr] = gate; // only do this if they differ RptrGate[rptr] = gate; // only do this if they differ
if (addr.npos == addr.find(':')) GateAddr[gate] = addr;
GateIPV4[gate] = addr;
else
GateIPV6[gate] = addr;
mux.unlock(); mux.unlock();
} }
@ -142,10 +139,7 @@ void CCacheManager::updateRptr(const std::string &rptr, const std::string &gate,
mux.unlock(); mux.unlock();
return; return;
} }
if (addr.npos == addr.find(':')) GateAddr[gate] = addr;
GateIPV4[gate] = addr;
else
GateIPV6[gate] = addr;
mux.unlock(); mux.unlock();
} }
@ -160,10 +154,7 @@ void CCacheManager::updateGate(const std::string &G, const std::string &addr)
p = gate.find('_'); p = gate.find('_');
} }
mux.lock(); mux.lock();
if (addr.npos == addr.find(':')) GateAddr[gate] = addr;
GateIPV4[gate] = addr;
else
GateIPV6[gate] = addr;
mux.unlock(); mux.unlock();
} }
@ -179,8 +170,7 @@ void CCacheManager::updateName(const std::string &name, const std::string &nick)
void CCacheManager::eraseGate(const std::string &gate) void CCacheManager::eraseGate(const std::string &gate)
{ {
mux.lock(); mux.lock();
GateIPV4.erase(gate); GateAddr.erase(gate);
GateIPV6.erase(gate);
mux.unlock(); mux.unlock();
} }
@ -194,8 +184,7 @@ void CCacheManager::eraseName(const std::string &name)
void CCacheManager::clearGate() void CCacheManager::clearGate()
{ {
mux.lock(); mux.lock();
GateIPV4.clear(); GateAddr.clear();
GateIPV6.clear();
NameNick.clear(); NameNick.clear();
mux.unlock(); mux.unlock();
} }
@ -231,15 +220,8 @@ std::string CCacheManager::findGateAddr(const std::string &gate)
std::string addr; std::string addr;
if (gate.empty()) if (gate.empty())
return addr; return addr;
auto it6 = GateIPV6.find(gate); auto ita = GateAddr.find(gate);
if (it6 == GateIPV6.end()) { if (ita != GateAddr.end())
auto it4 = GateIPV4.find(gate); addr.assign(ita->second);
if (it4 == GateIPV4.end()) {
return addr;
} else {
addr.assign(it4->second);
}
} else
addr.assign(it6->second);
return addr; return addr;
} }

@ -55,8 +55,7 @@ private:
std::unordered_map<std::string, std::string> UserTime; std::unordered_map<std::string, std::string> UserTime;
std::unordered_map<std::string, std::string> UserRptr; std::unordered_map<std::string, std::string> UserRptr;
std::unordered_map<std::string, std::string> RptrGate; std::unordered_map<std::string, std::string> RptrGate;
std::unordered_map<std::string, std::string> GateIPV4; std::unordered_map<std::string, std::string> GateAddr;
std::unordered_map<std::string, std::string> GateIPV6;
std::unordered_map<std::string, std::string> NameNick; std::unordered_map<std::string, std::string> NameNick;
std::mutex mux; std::mutex mux;
}; };

@ -452,7 +452,7 @@ void CQnetGateway::GetIRCDataThread(const int i)
ii[i]->receivePing(rptr); ii[i]->receivePing(rptr);
if (! rptr.empty()) { if (! rptr.empty()) {
ReplaceChar(rptr, '_', ' '); ReplaceChar(rptr, '_', ' ');
cache.findRptrData(rptr, gate, addr); cache[i].findRptrData(rptr, gate, addr);
if (addr.empty()) if (addr.empty())
break; break;
CSockAddress to; CSockAddress to;
@ -477,11 +477,11 @@ void CQnetGateway::GetIRCDataThread(const int i)
} }
/* return codes: 0=OK(found it), 1=TRY AGAIN, 2=FAILED(bad data) */ /* return codes: 0=OK(found it), 1=TRY AGAIN, 2=FAILED(bad data) */
int CQnetGateway::get_yrcall_rptr_from_cache(const std::string &call, std::string &rptr, std::string &gate, std::string &addr, char RoU) int CQnetGateway::get_yrcall_rptr_from_cache(const int i, const std::string &call, std::string &rptr, std::string &gate, std::string &addr, char RoU)
{ {
switch (RoU) { switch (RoU) {
case 'U': case 'U':
cache.findUserData(call, rptr, gate, addr); cache[i].findUserData(call, rptr, gate, addr);
if (rptr.empty()) { if (rptr.empty()) {
printf("Could not find last heard repeater for user '%s'\n", call.c_str()); printf("Could not find last heard repeater for user '%s'\n", call.c_str());
return 1; return 1;
@ -489,7 +489,7 @@ int CQnetGateway::get_yrcall_rptr_from_cache(const std::string &call, std::strin
break; break;
case 'R': case 'R':
rptr.assign(call); rptr.assign(call);
cache.findRptrData(call, gate, addr); cache[i].findRptrData(call, gate, addr);
break; break;
default: default:
fprintf(stderr, "ERROR: Invalid Rou of '%c'\n", RoU); fprintf(stderr, "ERROR: Invalid Rou of '%c'\n", RoU);
@ -512,21 +512,19 @@ int CQnetGateway::get_yrcall_rptr_from_cache(const std::string &call, std::strin
int CQnetGateway::get_yrcall_rptr(const std::string &call, std::string &rptr, std::string &gate, std::string &addr, char RoU) int CQnetGateway::get_yrcall_rptr(const std::string &call, std::string &rptr, std::string &gate, std::string &addr, char RoU)
// returns 0 if unsuccessful, otherwise returns ii index plus one // returns 0 if unsuccessful, otherwise returns ii index plus one
{ {
int i = 0; int rval[2] = { 1, 1 };
int rc = get_yrcall_rptr_from_cache(call, rptr, gate, addr, RoU); for (int i=0; i<2; i++) {
if (0 == rc) { if (ii[i]) {
//printf("get_yrcall_rptr_from_cache: call='%s' rptr='%s' gate='%s', addr='%s' RoU=%c\n", call.c_str(), rptr.c_str(), gate.c_str(), addr.c_str(), RoU); rval[i] = get_yrcall_rptr_from_cache(i, call, rptr, gate, addr, RoU);
if ((addr.npos == addr.find(':')) && ii[1]) if (0 == rval[i])
i = 1;
return i + 1; return i + 1;
} else if (2 == rc) }
return 0; }
/* at this point, the data is not in cache */ /* at this point, the data is not in cache */
int cstate = ii[i]->getConnectionState(); for (int i=0; i<2; i++) {
if (cstate < 6) { if (ii[i] && (1 == rval[i])) {
return 0; if (ii[i]->getConnectionState() > 5) {
} else {
// we can try a find // we can try a find
if (RoU == 'U') { if (RoU == 'U') {
printf("User [%s] not in local cache, try again\n", call.c_str()); printf("User [%s] not in local cache, try again\n", call.c_str());
@ -538,9 +536,10 @@ int CQnetGateway::get_yrcall_rptr(const std::string &call, std::string &rptr, st
} else if (RoU == 'R') { } else if (RoU == 'R') {
printf("Repeater [%s] not found\n", call.c_str()); printf("Repeater [%s] not found\n", call.c_str());
} }
return 0;
} }
return i + 1; }
}
return 0;
} }
bool CQnetGateway::Flag_is_ok(unsigned char flag) bool CQnetGateway::Flag_is_ok(unsigned char flag)
@ -2341,7 +2340,7 @@ bool CQnetGateway::Init(char *cfgfile)
for (int j=0; j<2; j++) { for (int j=0; j<2; j++) {
if (ircddb[j].ip.empty()) if (ircddb[j].ip.empty())
continue; continue;
ii[j] = new CIRCDDB(ircddb[j].ip, ircddb[j].port, owner, IRCDDB_PASSWORD[j], GW_VERSION.c_str(), &cache); ii[j] = new CIRCDDB(ircddb[j].ip, ircddb[j].port, owner, IRCDDB_PASSWORD[j], GW_VERSION.c_str(), &cache[j]);
bool ok = ii[j]->open(); bool ok = ii[j]->open();
if (!ok) { if (!ok) {
printf("%s open failed\n", ircddb[j].ip.c_str()); printf("%s open failed\n", ircddb[j].ip.c_str());

@ -159,7 +159,7 @@ private:
CDStarDecode decode; CDStarDecode decode;
// CACHE used to cache users, repeaters, gateways and addresses // CACHE used to cache users, repeaters, gateways and addresses
CCacheManager cache; CCacheManager cache[2];
// dtmf stuff // dtmf stuff
int dtmf_buf_count[3]; int dtmf_buf_count[3];
@ -172,7 +172,7 @@ private:
int open_port(const SPORTIP *pip, int family); int open_port(const SPORTIP *pip, int family);
void calcPFCS(unsigned char *packet, int len); void calcPFCS(unsigned char *packet, int len);
void GetIRCDataThread(const int i); void GetIRCDataThread(const int i);
int get_yrcall_rptr_from_cache(const std::string &call, std::string &rptr, std::string &gate, std::string &addr, char RoU); int get_yrcall_rptr_from_cache(const int i, const std::string &call, std::string &rptr, std::string &gate, std::string &addr, char RoU);
int get_yrcall_rptr(const std::string &call, std::string &rptr, std::string &gate, std::string &addr, char RoU); int get_yrcall_rptr(const std::string &call, std::string &rptr, std::string &gate, std::string &addr, char RoU);
void PlayFileThread(SECHO &edata); void PlayFileThread(SECHO &edata);
void compute_aprs_hash(); void compute_aprs_hash();

Loading…
Cancel
Save

Powered by TurnKey Linux.