version 0.2.4
[fms.git] / include / freenet / iindexrequester.h
index 6ba9ae7..aecc00a 100644 (file)
 #include "ifcpmessagehandler.h"\r
 #include "iperiodicprocessor.h"\r
 \r
+#ifdef XMEM\r
+       #include <xmem.h>\r
+#endif\r
+\r
 template <class IDTYPE>\r
 class IIndexRequester:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
 {\r
 public:\r
        IIndexRequester();\r
        IIndexRequester(FCPv2 *fcp);\r
+       virtual ~IIndexRequester()              {}\r
 \r
        virtual void FCPConnected();\r
        virtual void FCPDisconnected();\r
@@ -36,6 +41,8 @@ protected:
        virtual void RemoveFromRequestList(const IDTYPE id);\r
 \r
        DateTime m_tempdate;\r
+       DateTime m_lastreceived;\r
+       DateTime m_lastpopulated;\r
        std::string m_messagebase;\r
        std::map<IDTYPE,bool> m_ids;                    // map of all ids we know and whether we have requested file from them yet\r
        std::vector<IDTYPE> m_requesting;               // list of ids we are currently requesting from\r
@@ -75,8 +82,10 @@ void IIndexRequester<IDTYPE>::FCPConnected()
                m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"IIndexRequester<IDTYPE>::FCPConnected fcpuniquename contains | character!  This is not a valid character!");\r
        }\r
 \r
+       m_lastreceived.SetToGMTime();\r
        m_requesting.clear();\r
        PopulateIDList();\r
+       m_lastpopulated.SetToGMTime();\r
 }\r
 \r
 template <class IDTYPE>\r
@@ -91,6 +100,9 @@ const bool IIndexRequester<IDTYPE>::HandleMessage(FCPMessage &message)
 \r
        if(message["Identifier"].find(m_fcpuniquename)==0)\r
        {\r
+\r
+               m_lastreceived.SetToGMTime();\r
+\r
                if(message.GetName()=="DataFound")\r
                {\r
                        return true;\r
@@ -127,20 +139,27 @@ void IIndexRequester<IDTYPE>::InitializeIIndexRequester()
        m_maxrequests=-1;\r
        m_fcpuniquename="";\r
 \r
-       Option::instance()->Get("MessageBase",m_messagebase);\r
+       Option::Instance()->Get("MessageBase",m_messagebase);\r
        m_tempdate.SetToGMTime();\r
+       m_lastreceived.SetToGMTime();\r
+       m_lastpopulated.SetToGMTime();\r
+       m_lastpopulated.Add(0,-10);\r
 }\r
 \r
 template <class IDTYPE>\r
 void IIndexRequester<IDTYPE>::Process()\r
 {\r
-       // max is the smaller of the config value or the total number of identities we will request from\r
-       long max=m_maxrequests>m_ids.size() ? m_ids.size() : m_maxrequests;\r
+       DateTime now;\r
+       now.SetToGMTime();\r
+\r
+       // max is the smaller of the config value or the total number of ids we will request from\r
+       typename std::map<IDTYPE,bool>::size_type max=m_maxrequests>m_ids.size() ? m_ids.size() : m_maxrequests;\r
 \r
        // try to keep up to max requests going\r
        if(m_requesting.size()<max)\r
        {\r
-               std::map<IDTYPE,bool>::iterator i=m_ids.begin();\r
+               typename std::map<IDTYPE,bool>::iterator i=m_ids.begin();\r
+\r
                while(i!=m_ids.end() && (*i).second==true)\r
                {\r
                        i++;\r
@@ -152,19 +171,27 @@ void IIndexRequester<IDTYPE>::Process()
                }\r
                else\r
                {\r
-                       // we requested from all ids in the list, repopulate the list\r
-                       PopulateIDList();\r
+                       // we requested from all ids in the list, repopulate the list (only every 10 minutes)\r
+                       if(m_lastpopulated<(now-1.0/144.0))\r
+                       {\r
+                               PopulateIDList();\r
+                               m_lastpopulated.SetToGMTime();\r
+                       }\r
                }\r
        }\r
        // special case - if there were 0 ids on the list when we started then we will never get a chance to repopulate the list\r
        // this will recheck for ids every minute\r
-       DateTime now;\r
-       now.SetToGMTime();\r
-       if(m_tempdate<(now-(1.0/1440.0)))\r
+       if(m_ids.size()==0 && m_tempdate<(now-(1.0/1440.0)))\r
        {\r
                PopulateIDList();\r
                m_tempdate=now;\r
        }\r
+       // if we haven't received any messages to this object in 10 minutes, clear the requests and repopulate id list\r
+       if(m_ids.size()>0 && m_lastreceived<(now-(1.0/144.0)))\r
+       {\r
+               m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"IIndexRequester<IDTYPE>::Process() Object has not received any messages in 10 minutes.  Restarting requests.");\r
+               FCPConnected();\r
+       }\r
 \r
 }\r
 \r
@@ -179,7 +206,7 @@ void IIndexRequester<IDTYPE>::RegisterWithThread(FreenetMasterThread *thread)
 template <class IDTYPE>\r
 void IIndexRequester<IDTYPE>::RemoveFromRequestList(const IDTYPE id)\r
 {\r
-       std::vector<IDTYPE>::iterator i=m_requesting.begin();\r
+       typename std::vector<IDTYPE>::iterator i=m_requesting.begin();\r
        while(i!=m_requesting.end() && (*i)!=id)\r
        {\r
                i++;\r