changeset 3418:f16bb9acb9f5 draft

Don't retry a failing IRC nickname forever. If our IRC nick is in use (because some other node thinks it has the same address we think we have) don't fruitlessly try to reconnect using that name forever. After three tries, give up and use a random nick. Either we'll learn a new local address from IRC and switch to that, or it was right and the other guy is advertising for us. This avoids a pessimal case where a second testnet node behind a nat is unable to get any peers because he can't get on IRC.
author Gregory Maxwell <greg@xiph.org>
date Tue, 28 Aug 2012 22:04:38 -0400
parents 2a79ab883ace
children 97c6de034d83
files src/irc.cpp
diffstat 1 files changed, 5 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/irc.cpp
+++ b/src/irc.cpp
@@ -222,6 +222,7 @@
     printf("ThreadIRCSeed started\n");
     int nErrorWait = 10;
     int nRetryWait = 10;
+    int nNameRetry = 0;
 
     while (!fShutdown)
     {
@@ -257,7 +258,8 @@
         CService addrLocal;
         string strMyName;
         // Don't use our IP as our nick if we're not listening
-        if (!fNoListen && GetLocal(addrLocal, &addrIPv4))
+        // or if it keeps failing because the nick is already in use.
+        if (!fNoListen && GetLocal(addrLocal, &addrIPv4) && nNameRetry<3)
             strMyName = EncodeAddress(GetLocalAddress(&addrConnect));
         if (strMyName == "")
             strMyName = strprintf("x%u", GetRand(1000000000));
@@ -273,6 +275,7 @@
             if (nRet == 2)
             {
                 printf("IRC name already in use\n");
+                nNameRetry++;
                 Wait(10);
                 continue;
             }
@@ -282,6 +285,7 @@
             else
                 return;
         }
+        nNameRetry = 0;
         Sleep(500);
 
         // Get our external IP from the IRC server and re-nick before joining the channel