improve dht resource expiration policy (still not enabled)

This commit is contained in:
Miguel Freitas 2013-10-26 16:00:16 -02:00
parent 3e64454b7d
commit 1d78f7ec27
2 changed files with 58 additions and 11 deletions

View File

@ -42,7 +42,8 @@ static map<sha1_hash, alert_manager*> m_dhtgetMap;
static CCriticalSection cs_twister; static CCriticalSection cs_twister;
static map<std::string, bool> m_specialResources; static map<std::string, bool> m_specialResources;
static map<std::string, bool> m_noExpireResources; // bool is true if expected number after resource string enum ExpireResType { SimpleNoExpire, NumberedNoExpire, PostNoExpireRecent };
static map<std::string, ExpireResType> m_noExpireResources;
static map<std::string, torrent_handle> m_userTorrent; static map<std::string, torrent_handle> m_userTorrent;
static std::string m_preferredSpamLang = "[en]"; static std::string m_preferredSpamLang = "[en]";
@ -442,10 +443,22 @@ void startSessionTorrent(boost::thread_group& threadGroup)
m_specialResources["tracker"] = true; m_specialResources["tracker"] = true;
m_specialResources["swarm"] = true; m_specialResources["swarm"] = true;
// these are the resources which shouldn't expire (true when numbering is expected) // these are the resources which shouldn't expire
m_noExpireResources["avatar"] = false; m_noExpireResources["avatar"] = SimpleNoExpire;
m_noExpireResources["profile"] = false; m_noExpireResources["profile"] = SimpleNoExpire;
m_noExpireResources["following"] = true; m_noExpireResources["following"] = NumberedNoExpire;
m_noExpireResources["status"] = SimpleNoExpire;
m_noExpireResources["post"] = PostNoExpireRecent;
shouldDhtResourceExpire("post", false, 0);
shouldDhtResourceExpire("post0", false, 0);
shouldDhtResourceExpire("post01", false, 0);
shouldDhtResourceExpire("post1 ", false, 0);
shouldDhtResourceExpire("post1233", false, 0);
shouldDhtResourceExpire("avatar", false, 0);
shouldDhtResourceExpire("following", false, 0);
shouldDhtResourceExpire("following300", false, 0);
threadGroup.create_thread(boost::bind(&ThreadWaitExtIP)); threadGroup.create_thread(boost::bind(&ThreadWaitExtIP));
@ -890,31 +903,63 @@ bool shouldDhtResourceExpire(std::string resource, bool multi, int height)
return true; return true;
} }
// extract basic resource string (without numbering)
std::string resourceBasic; std::string resourceBasic;
for(size_t i = 0; i < resource.size() && isalpha(resource.at(i)); i++) { for(size_t i = 0; i < resource.size() && isalpha(resource.at(i)); i++) {
resourceBasic.push_back(resource.at(i)); resourceBasic.push_back(resource.at(i));
} }
int resourceNumber = -1;
int resourceNumber = -1;
if( resource.length() > resourceBasic.length() ) { if( resource.length() > resourceBasic.length() ) {
// make sure it is a valid number following (all digits)
if( resource.at(resourceBasic.length()) == '0' &&
resource.size() > resourceBasic.length() + 1 ){
// leading zeros not allowed
} else {
size_t i;
for(i = resourceBasic.length(); i < resource.size() &&
isdigit(resource.at(i)); i++) {
}
if(i == resource.size()) {
resourceNumber = atoi( resource.c_str() + resourceBasic.length() ); resourceNumber = atoi( resource.c_str() + resourceBasic.length() );
printf("shouldDhtResourceExpire: %s = %s + %d\n", resource.c_str(), resourceBasic.c_str(), resourceNumber);
}
}
} }
if( !m_noExpireResources.count(resourceBasic) ) { if( !m_noExpireResources.count(resourceBasic) ) {
// unknown resource. expire it. // unknown resource. expire it.
#ifdef DEBUG_EXPIRE_DHT_ITEM
printf("shouldDhtResourceExpire: expiring non-special resource '%s'\n", resource.c_str()); printf("shouldDhtResourceExpire: expiring non-special resource '%s'\n", resource.c_str());
#endif
return true;
} else { } else {
if( !m_noExpireResources[resourceBasic] && resourceNumber >= 0 ) { if( m_noExpireResources[resourceBasic] == SimpleNoExpire &&
resource.length() > resourceBasic.length() ) {
// this resource admits no number. expire it! // this resource admits no number. expire it!
#ifdef DEBUG_EXPIRE_DHT_ITEM #ifdef DEBUG_EXPIRE_DHT_ITEM
printf("shouldDhtResourceExpire: expiring resource with unexpected numbering '%s'\n", resource.c_str()); printf("shouldDhtResourceExpire: expiring resource with unexpected numbering '%s'\n", resource.c_str());
#endif #endif
return true; return true;
} }
if( m_noExpireResources[resourceBasic] && resourceNumber > 200 ) { if( m_noExpireResources[resourceBasic] == NumberedNoExpire &&
(resourceNumber < 0 || resourceNumber > 200) ) {
// try keeping a sane number here, otherwise expire it! // try keeping a sane number here, otherwise expire it!
#ifdef DEBUG_EXPIRE_DHT_ITEM #ifdef DEBUG_EXPIRE_DHT_ITEM
printf("shouldDhtResourceExpire: expiring resource with numbering too big '%s'\n", resource.c_str()); printf("shouldDhtResourceExpire: expiring numbered resource with no sane number '%s'\n", resource.c_str());
#endif
return true;
}
if( m_noExpireResources[resourceBasic] == PostNoExpireRecent && resourceNumber < 0 ) {
#ifdef DEBUG_EXPIRE_DHT_ITEM
printf("shouldDhtResourceExpire: expiring post with invalid numbering '%s'\n", resource.c_str());
#endif
return true;
}
if( m_noExpireResources[resourceBasic] == PostNoExpireRecent &&
(height + BLOCK_AGE_TO_EXPIRE_DHT_POSTS) < getBestHeight() ) {
#ifdef DEBUG_EXPIRE_DHT_ITEM
printf("shouldDhtResourceExpire: expiring old post resource '%s'\n", resource.c_str());
#endif #endif
return true; return true;
} }

View File

@ -10,7 +10,9 @@
#define USERPOST_FLAG_RT 0x01 #define USERPOST_FLAG_RT 0x01
#define USERPOST_FLAG_DM 0x02 #define USERPOST_FLAG_DM 0x02
#define BLOCK_AGE_TO_EXPIRE_DHT_ENTRY 2000 #define BLOCK_AGE_TO_EXPIRE_DHT_ENTRY (2016) // about 2 weeks
#define BLOCK_AGE_TO_EXPIRE_DHT_POSTS (4320*6) // about 6 months
class twister class twister
{ {