Skip to content

Commit 5261f84

Browse files
committed
[DHT] Add get events RPC command
1 parent bb22ae5 commit 5261f84

File tree

3 files changed

+63
-1
lines changed

3 files changed

+63
-1
lines changed

src/dht/rpcdht.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,6 +1162,42 @@ static UniValue ReannounceLocalMutable(const JSONRPCRequest& request)
11621162
return result;
11631163
}
11641164

1165+
static UniValue GetHashTableEvents(const JSONRPCRequest& request)
1166+
{
1167+
if (request.fHelp || request.params.size() != 1)
1168+
throw std::runtime_error(
1169+
"dht events\n"
1170+
"\nReturns DHT events.\n"
1171+
"\nResult:\n"
1172+
"{(json object)\n"
1173+
" \"link_requestor\" (string) BDAP account that initiated the link\n"
1174+
"}\n"
1175+
"\nExamples\n" +
1176+
HelpExampleCli("dht reannounce", "\"88196b9f8ca5f1dfb095bd48e18d97157f7a4435\"") +
1177+
"\nAs a JSON-RPC call\n" +
1178+
HelpExampleRpc("dht reannounce", "\"88196b9f8ca5f1dfb095bd48e18d97157f7a4435\""));
1179+
1180+
if (!DHT::SessionStatus())
1181+
throw JSONRPCError(RPC_DHT_NOT_STARTED, strprintf("dht %s failed. DHT session not started.", request.params[0].get_str()));
1182+
1183+
UniValue results(UniValue::VOBJ);
1184+
std::vector<CEvent> events;
1185+
DHT::GetEvents(0, events);
1186+
size_t nCount = 0;
1187+
for (const CEvent& event : events) {
1188+
nCount++;
1189+
UniValue oEventItem(UniValue::VOBJ);
1190+
oEventItem.push_back(Pair("message", event.Message()));
1191+
oEventItem.push_back(Pair("type", (int)event.Type()));
1192+
oEventItem.push_back(Pair("category", (int)event.Category()));
1193+
oEventItem.push_back(Pair("what", event.What()));
1194+
oEventItem.push_back(Pair("timestamp", (int)event.Timestamp()));
1195+
results.push_back(Pair("event_" + std::to_string(nCount), oEventItem));
1196+
}
1197+
1198+
return results;
1199+
}
1200+
11651201
UniValue dht_rpc(const JSONRPCRequest& request)
11661202
{
11671203
std::string strCommand;
@@ -1229,6 +1265,9 @@ UniValue dht_rpc(const JSONRPCRequest& request)
12291265
else if (strCommand == "reannounce") {
12301266
return ReannounceLocalMutable(request);
12311267
}
1268+
else if (strCommand == "events") {
1269+
return GetHashTableEvents(request);
1270+
}
12321271
else {
12331272
throw JSONRPCError(RPC_METHOD_NOT_FOUND, strprintf("%s is an unknown DHT method command.", strCommand));
12341273
}

src/dht/session.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,6 @@ void StartEventListener(std::shared_ptr<CHashTableSession> dhtSession)
217217
} else {
218218
const CEvent event(strAlertMessage, iAlertType, iAlertCategory, strAlertTypeName);
219219
dhtSession->AddToEventMap(iAlertType, event);
220-
LogPrintf("%s -- \nEvent\n%s\n", __func__, event.ToString());
221220
}
222221
}
223222
if (dhtSession->fShutdown)
@@ -843,6 +842,19 @@ bool CHashTableSession::GetLastTypeEvent(const int& type, const int64_t& startTi
843842
return events.size() > 0;
844843
}
845844

845+
void CHashTableSession::GetEvents(const int64_t& startTime, std::vector<CEvent>& events)
846+
{
847+
LOCK(cs_EventMap);
848+
std::multimap<int, EventPair>::iterator iEvents = m_EventTypeMap.begin();
849+
while (iEvents != m_EventTypeMap.end()) {
850+
if (iEvents->second.first >= startTime) {
851+
events.push_back(iEvents->second.second);
852+
}
853+
iEvents++;
854+
}
855+
LogPrintf("%s -- events.size() = %u\n", __func__, events.size());
856+
}
857+
846858
bool CHashTableSession::FindDHTGetEvent(const std::string& infoHash, CMutableGetEvent& event)
847859
{
848860
//LOCK(cs_DHTGetEventMap);
@@ -1059,4 +1071,12 @@ bool ReannounceEntry(const CMutableData& mutableData)
10591071
return arraySessions[0].second->ReannounceEntry(mutableData);
10601072
}
10611073

1074+
void GetEvents(const int64_t& startTime, std::vector<CEvent>& events)
1075+
{
1076+
size_t nRunningThreads = fMultiThreads ? nThreads : 1;
1077+
for (unsigned int i = 0; i < nRunningThreads; i++) {
1078+
arraySessions[i].second->GetEvents(startTime, events);
1079+
}
1080+
}
1081+
10621082
} // end DHT namespace

src/dht/session.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class CHashTableSession {
8888
void CleanUpEventMap(const uint32_t timeout);
8989
void StopEventListener();
9090
bool ReannounceEntry(const CMutableData& mutableData);
91+
void GetEvents(const int64_t& startTime, std::vector<CEvent>& events);
9192

9293
private:
9394
bool GetDataFromMap(const std::array<char, 32>& public_key, const std::string& recordSalt, CMutableGetEvent& event);
@@ -125,6 +126,8 @@ namespace DHT
125126
bool GetAllDHTGetEvents(const size_t nSessionThread, std::vector<CMutableGetEvent>& vchGetEvents);
126127
void GetDHTStats(CSessionStats& stats);
127128
bool ReannounceEntry(const CMutableData& mutableData);
129+
void GetEvents(const int64_t& startTime, std::vector<CEvent>& events);
130+
128131
}
129132

130133
#endif // DYNAMIC_DHT_SESSION_H

0 commit comments

Comments
 (0)