]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Handle temporary failures on gk registration
authorAlexandr Anikin <may@telecom-service.ru>
Thu, 19 Dec 2013 08:35:28 +0000 (08:35 +0000)
committerAlexandr Anikin <may@telecom-service.ru>
Thu, 19 Dec 2013 08:35:28 +0000 (08:35 +0000)
Introduce new 'stopped' state for gk client and restart gk client
on failures
Remove ooh323 stack command lock as it is not need now.
(closes issue ASTERISK-21960)
Reported by: Dmitry Melekhov
Patches:
ASTERISK-21960.patch
ASTERISK-21960-stacklockup-2.patch
Tested by: Dmitry Melekhov
........

Merged revisions 404318 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 404320 from http://svn.asterisk.org/svn/asterisk/branches/12

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@404321 65c4cc65-6c06-0410-ace0-fbb531ad65f3

addons/chan_ooh323.c
addons/ooh323c/src/ooGkClient.c
addons/ooh323c/src/ooGkClient.h
addons/ooh323c/src/oochannels.c

index 8111b712ec3d4c1bce521defdbeb2e9feb82a758..52c0404a5f50c0db64e0e6753fb5c58eca9d263e 100644 (file)
@@ -295,8 +295,6 @@ AST_MUTEX_DEFINE_STATIC(h323_reload_lock);
 static int usecnt = 0;
 AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
-AST_MUTEX_DEFINE_STATIC(ooh323c_cmd_lock);
-
 static long callnumber = 0;
 AST_MUTEX_DEFINE_STATIC(ooh323c_cn_lock);
 
@@ -696,7 +694,7 @@ static struct ast_channel *ooh323_request(const char *type, struct ast_format_ca
                        ooh323_destroy(p);
                        ast_mutex_unlock(&iflock);
                        return NULL;
-               } else if (gH323ep.gkClient && gH323ep.gkClient->state != GkClientRegistered) {
+               } else if (!gH323ep.gkClient || (gH323ep.gkClient && gH323ep.gkClient->state != GkClientRegistered)) {
                        ast_log(LOG_ERROR, "Gatekeeper client is configured but not registered\n");
                        *cause = AST_CAUSE_NORMAL_TEMPORARY_FAILURE;
                        return NULL;
@@ -751,7 +749,6 @@ static struct ast_channel *ooh323_request(const char *type, struct ast_format_ca
                }
 
                ast_mutex_unlock(&p->lock);
-               ast_mutex_lock(&ooh323c_cmd_lock);
                ast_cond_init(&p->rtpcond, NULL);
                ooMakeCall(data, p->callToken, AST_MAX_EXTENSION, NULL);
                ast_mutex_lock(&p->lock);
@@ -760,7 +757,6 @@ static struct ast_channel *ooh323_request(const char *type, struct ast_format_ca
                }
                ast_mutex_unlock(&p->lock);
                ast_cond_destroy(&p->rtpcond);
-               ast_mutex_unlock(&ooh323c_cmd_lock);
        }
 
        restart_monitor();
@@ -3505,6 +3501,9 @@ static char *handle_cli_ooh323_show_gk(struct ast_cli_entry *e, int cmd, struct
        case GkClientFailed:
                ast_cli(a->fd, "%-20s%s\n", "GK state:", "Failed");
                break;
+       case GkClientStopped:
+               ast_cli(a->fd, "%-20s%s\n", "GK state:", "Shutdown");
+               break;
        default:
                break;
        }
@@ -3946,6 +3945,13 @@ static void *do_monitor(void *data)
                        ast_verb(1, "Reloading H.323\n");
                        ooh323_do_reload();
                }
+               if (gH323ep.gkClient && gH323ep.gkClient->state == GkClientStopped) {
+                       ooGkClientDestroy();
+                       ast_verb(0, "Restart stopped gatekeeper client\n");
+                       ooGkClientInit(gRasGkMode, (gRasGkMode == RasUseSpecificGatekeeper) ? 
+                                                                       gGatekeeper : 0, 0);
+                       ooGkClientStart(gH323ep.gkClient);
+               }
 
                /* Check for interfaces needing to be killed */
                ast_mutex_lock(&iflock);
index 3aaaba774b9935afae2d1f82da44793724195bb5..af6a10bbd37c30dfbb3e682fd9cc84c52bb0d6b7 100644 (file)
@@ -2851,13 +2851,13 @@ int ooGkClientHandleClientOrGkFailure(ooGkClient *pGkClient)
       {
          OOTRACEERR1("Error: Gatekeeper error detected. Closing GkClient as "
                      "Gk mode is UseSpecifcGatekeeper\n");
-         ooGkClientDestroy();
+        pGkClient->state = GkClientStopped;
          return OO_FAILED;
       }
       else{
          OOTRACEERR1("Error: Gatekeeper error detected. Closing GkClient. NEED"
                     " to implement recovery by rediscovering another gk\n");
-         ooGkClientDestroy();
+        pGkClient->state = GkClientStopped;
          return OO_FAILED;
       }
    }
index e12b45a9621154b038298ebac0cd8d369fd54a0f..59230e9539d3845bd5dbe95f3db53a31f0db520f 100644 (file)
@@ -108,7 +108,8 @@ enum OOGkClientState {
    GkClientRegistered, /* registered with gk */
    GkClientUnregistered,
    GkClientGkErr,/*Gk is not responding, in discover mode can look for new GK*/
-   GkClientFailed
+   GkClientFailed,
+   GkClientStopped
 };
    
 
index f581d76f992bcf6d37c4e92cddf0d6146729b767..de85389100985e3bb72f4f9ae1f79f553ad5b0e3 100644 (file)
@@ -603,11 +603,7 @@ int ooProcessFDSETsAndTimers
       if(gH323ep.gkClient->state == GkClientFailed ||
          gH323ep.gkClient->state == GkClientGkErr)
       {
-         if(ooGkClientHandleClientOrGkFailure(gH323ep.gkClient)!=OO_OK)
-         {
-            //ooStopMonitorCalls(); //Function calling ooProcessFDSETsAndTimers is responsible for this.
-            return OO_FAILED;
-         }
+         ooGkClientHandleClientOrGkFailure(gH323ep.gkClient);
       }
    }