From 0491046e7eb741586f70f17d0b19826409489cb2 Mon Sep 17 00:00:00 2001
From: Richard Alam <ritzalam@gmail.com>
Date: Tue, 1 Oct 2019 14:31:47 -0700
Subject: [PATCH]  - stop trying to eject after several attempts if
 unsuccessful.

---
 .../freeswitch/FreeswitchApplication.java     |  2 +-
 .../actions/CheckIfConfIsRunningCommand.java  | 62 +++++++++++--------
 2 files changed, 36 insertions(+), 28 deletions(-)

diff --git a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/FreeswitchApplication.java b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/FreeswitchApplication.java
index 74ccdf05f1..2065107c59 100755
--- a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/FreeswitchApplication.java
+++ b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/FreeswitchApplication.java
@@ -170,7 +170,7 @@ public class FreeswitchApplication implements  IDelayedCommandListener{
 
           CheckIfConfIsRunningCommand command = new CheckIfConfIsRunningCommand(cmd.getRoom(),
                   cmd.getRequesterId(),
-                  delayedCommandSenderService);
+                  delayedCommandSenderService, 0);
           delayedCommandSenderService.handleMessage(command, 5000);
         } else if (command instanceof TransferUserToMeetingCommand) {
           TransferUserToMeetingCommand cmd = (TransferUserToMeetingCommand) command;
diff --git a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/CheckIfConfIsRunningCommand.java b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/CheckIfConfIsRunningCommand.java
index a6f8e8e5f3..140d3b61da 100755
--- a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/CheckIfConfIsRunningCommand.java
+++ b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/CheckIfConfIsRunningCommand.java
@@ -38,10 +38,14 @@ import java.util.regex.Matcher;
 public class CheckIfConfIsRunningCommand extends FreeswitchCommand {
     private static Logger log = LoggerFactory.getLogger(CheckIfConfIsRunningCommand.class);
     private DelayedCommandSenderService delayedCommandSenderService;
+    private Integer forceEjectCount = 0;
 
-    public CheckIfConfIsRunningCommand(String room, String requesterId, DelayedCommandSenderService delayedCommandSenderService) {
+    public CheckIfConfIsRunningCommand(String room, String requesterId,
+                                       DelayedCommandSenderService delayedCommandSenderService,
+                                       Integer forceEjectCount) {
             super(room, requesterId);
             this.delayedCommandSenderService = delayedCommandSenderService;
+            this.forceEjectCount = forceEjectCount;
     }
     
     @Override
@@ -85,36 +89,40 @@ public class CheckIfConfIsRunningCommand extends FreeswitchCommand {
 
             Integer numUsers =  confXML.getConferenceList().size();
             if (numUsers > 0) {
-
                 log.info("Check conference response: " + responseBody);
                 log.warn("WARNING! Failed to eject all users from conf={},numUsers={}.", room, numUsers);
-                for(ConferenceMember member : confXML.getConferenceList()) {
-                    if ("caller".equals(member.getMemberType())) {
-                        //Foreach found member in conference create a JoinedEvent
-                        String callerId = member.getCallerId();
-                        String callerIdName = member.getCallerIdName();
-                        String voiceUserId = callerIdName;
-                        String uuid = member.getUUID();
-                        log.info("WARNING! User possibly stuck in conference. uuid=" + uuid
-                                + ",caller=" + callerIdName + ",callerId=" + callerId + ",conf=" + room);
-
-                        // We have stubborn users that cannot be ejected from the voice conference.
-                        // This results in the voice conference hanging around for potentially a long time.
-                        // Force ejection by killing their uuid. (ralam Oct 1, 2019)
-                        ForceEjectUserCommand forceEjectUserCommand = new ForceEjectUserCommand(getRoom(),
-                                member.getId().toString(),
-                                member.getUUID());
-                        delayedCommandSenderService.handleMessage(forceEjectUserCommand, 5000L);
-
-                    } else if ("recording_node".equals(member.getMemberType())) {
-
+                if (forceEjectCount <= 5) {
+                    for (ConferenceMember member : confXML.getConferenceList()) {
+                        if ("caller".equals(member.getMemberType())) {
+                            //Foreach found member in conference create a JoinedEvent
+                            String callerId = member.getCallerId();
+                            String callerIdName = member.getCallerIdName();
+                            String voiceUserId = callerIdName;
+                            String uuid = member.getUUID();
+                            log.info("WARNING! User possibly stuck in conference. uuid=" + uuid
+                                    + ",caller=" + callerIdName + ",callerId=" + callerId + ",conf=" + room);
+
+                            // We have stubborn users that cannot be ejected from the voice conference.
+                            // This results in the voice conference hanging around for potentially a long time.
+                            // Force ejection by killing their uuid. (ralam Oct 1, 2019)
+                            ForceEjectUserCommand forceEjectUserCommand = new ForceEjectUserCommand(getRoom(),
+                                    member.getId().toString(),
+                                    member.getUUID());
+                            delayedCommandSenderService.handleMessage(forceEjectUserCommand, 5000L);
+
+                        } else if ("recording_node".equals(member.getMemberType())) {
+
+                        }
                     }
+                    // Check again if the conference is still running after ejecting the users. (ralam Oct. 1, 2019)
+                    CheckIfConfIsRunningCommand command = new CheckIfConfIsRunningCommand(getRoom(),
+                            getRequesterId(),
+                            delayedCommandSenderService,
+                            forceEjectCount + 1);
+                    delayedCommandSenderService.handleMessage(command, 10000);
+                } else {
+                    log.warn("Failed to eject users for voice conf " + getRoom() + " after " + forceEjectCount + " tries.");
                 }
-                // Check again if the conference is still running after ejecting the users. (ralam Oct. 1, 2019)
-                CheckIfConfIsRunningCommand command = new CheckIfConfIsRunningCommand(getRoom(),
-                        getRequesterId(),
-                        delayedCommandSenderService);
-                delayedCommandSenderService.handleMessage(command, 10000);
             } else {
                 log.info("INFO! Successfully ejected all users from conference {}.", room);
             }
-- 
GitLab