]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/treeserver.h
Link m_ldap against libldap_r
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / treeserver.h
index 6bd1a4f7ca1a7da184b7fffec7e037b961094852..f06e0bafa8307f3ca23177b2c6ae48bf22f9d9c4 100644 (file)
@@ -53,18 +53,36 @@ class TreeServer : public Server
        bool LastPingWasGood;                   /* True if the server responded to the last PING with a PONG */
        std::string sid;                        /* Server ID */
 
+       /** Counter counting how many servers are bursting in front of this server, including
+        * this server. Set to parents' value on construction then it is increased if the
+        * server itself starts bursting. Decreased when a server on the path to this server
+        * finishes burst.
+        */
+       unsigned int behind_bursting;
+
+       /** True if this server has been lost in a split and is awaiting destruction
+        */
+       bool isdead;
+
        /** This method is used to add this TreeServer to the
         * hash maps. It is only called by the constructors.
         */
        void AddHashEntry();
 
+       /** Used by SQuit logic to recursively remove servers
+        */
+       void SQuitInternal(unsigned int& num_lost_servers);
+
+       /** Remove the reference to this server from the hash maps
+        */
+       void RemoveHash();
+
  public:
        typedef std::vector<TreeServer*> ChildServers;
        FakeUser* const ServerUser;             /* User representing this server */
        const time_t age;
 
        bool Warned;                            /* True if we've warned opers about high latency on this server */
-       bool bursting;                          /* whether or not this server is bursting */
 
        unsigned int UserCount;                 /* How many users are on this server? [note: doesn't care about +i] */
        unsigned int OperCount;                 /* How many opers are on this server? */
@@ -81,7 +99,21 @@ class TreeServer : public Server
         */
        TreeServer(const std::string& Name, const std::string& Desc, const std::string& id, TreeServer* Above, TreeSocket* Sock, bool Hide);
 
-       int QuitUsers(const std::string &reason);
+       /** SQuit a server connected to this server, removing the given server and all servers behind it
+        * @param server Server to squit, must be directly below this server
+        * @param reason Reason for quitting the server, sent to opers and other servers
+        */
+       void SQuitChild(TreeServer* server, const std::string& reason);
+
+       /** SQuit this server, removing this server and all servers behind it
+        * @param reason Reason for quitting the server, sent to opers and other servers
+        */
+       void SQuit(const std::string& reason)
+       {
+               GetParent()->SQuitChild(this, reason);
+       }
+
+       static unsigned int QuitUsers(const std::string& reason);
 
        /** Get route.
         * The 'route' is defined as the locally-
@@ -97,6 +129,11 @@ class TreeServer : public Server
         */
        bool IsLocal() const { return (this->Route == this); }
 
+       /** Returns true if the server is awaiting destruction
+        * @return True if the server is waiting to be culled and deleted, false otherwise
+        */
+       bool IsDead() const { return isdead; }
+
        /** Get server version string
         */
        const std::string& GetVersion();
@@ -175,12 +212,6 @@ class TreeServer : public Server
         */
        bool DelChild(TreeServer* Child);
 
-       /** Removes child nodes of this node, and of that node, etc etc.
-        * This is used during netsplits to automatically tidy up the
-        * server tree. It is slow, we don't use it for much else.
-        */
-       void Tidy();
-
        /** Get server ID
         */
        const std::string& GetID();
@@ -195,11 +226,25 @@ class TreeServer : public Server
         */
        void CheckULine();
 
+       /** Get the bursting state of this server
+        * @return True if this server is bursting, false if it isn't
+        */
+       bool IsBursting() const { return (StartBurst != 0); }
+
+       /** Check whether this server is behind a bursting server or is itself bursting.
+        * This can tell whether a user is on a part of the network that is still bursting.
+        * @return True if this server is bursting or is behind a server that is bursting, false if it isn't
+        */
+       bool IsBehindBursting() const { return (behind_bursting != 0); }
+
+       /** Set the bursting state of the server
+        * @param startms Time the server started bursting, if 0 or omitted, use current time
+        */
+       void BeginBurst(unsigned long startms = 0);
+
        CullResult cull();
 
-       /** Destructor
-        * Removes the reference to this object from the
-        * hash maps.
+       /** Destructor, deletes ServerUser unless IsRoot()
         */
        ~TreeServer();