From f501fb5803d4b9e9b65cf94c3aeac655d857c847 Mon Sep 17 00:00:00 2001
From: Richard Alam <ritzalam@gmail.com>
Date: Thu, 21 Jan 2016 20:43:28 +0000
Subject: [PATCH]  - expire redis recording keys after 14 days

---
 .../core/service/recorder/RedisDispatcher.java    | 15 +++++++++++----
 akka-bbb-apps/src/main/resources/application.conf |  2 ++
 .../src/main/scala/org/bigbluebutton/Boot.scala   |  2 +-
 .../org/bigbluebutton/SystemConfiguration.scala   |  1 +
 .../app/video/EventRecordingService.java          |  8 +++++---
 .../webapp/WEB-INF/bigbluebutton-video.properties |  2 ++
 bbb-video/src/main/webapp/WEB-INF/red5-web.xml    |  1 +
 .../deskshare/server/recorder/EventRecorder.java  | 10 ++++++----
 .../src/main/webapp/WEB-INF/deskshare.properties  |  3 ++-
 .../app/src/main/webapp/WEB-INF/red5-web.xml      |  1 +
 10 files changed, 32 insertions(+), 13 deletions(-)

diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/service/recorder/RedisDispatcher.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/service/recorder/RedisDispatcher.java
index 7be78cd6a4..5df1e393a6 100755
--- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/service/recorder/RedisDispatcher.java
+++ b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/service/recorder/RedisDispatcher.java
@@ -27,8 +27,9 @@ public class RedisDispatcher implements Recorder {
 
 	private static final String COLON=":";
 	private JedisPool redisPool;
-
-	public RedisDispatcher(String host, int port, String password) {
+	private int keysExpiresInSec;
+	
+	public RedisDispatcher(String host, int port, String password, int keysExpiresInSec) {
 		GenericObjectPoolConfig config = new GenericObjectPoolConfig();
 		config.setMaxTotal(32);
 		config.setMaxIdle(8);
@@ -41,6 +42,8 @@ public class RedisDispatcher implements Recorder {
 		config.setTimeBetweenEvictionRunsMillis(60000);
 		config.setBlockWhenExhausted(true);
 		
+		this.keysExpiresInSec = keysExpiresInSec;
+		
 		// Set the name of this client to be able to distinguish when doing
 		// CLIENT LIST on redis-cli
 		redisPool = new JedisPool(config, host, port, Protocol.DEFAULT_TIMEOUT, null,
@@ -52,8 +55,12 @@ public class RedisDispatcher implements Recorder {
 		Jedis jedis = redisPool.getResource();
 		try {
 			Long msgid = jedis.incr("global:nextRecordedMsgId");
-			jedis.hmset("recording" + COLON + session + COLON + msgid, message.toMap());
-			jedis.rpush("meeting" + COLON + session + COLON + "recordings", msgid.toString());
+			String key = "recording" + COLON + session + COLON + msgid;
+			jedis.hmset(key, message.toMap());
+			jedis.expire(key, keysExpiresInSec);
+			key = "meeting" + COLON + session + COLON + "recordings";
+			jedis.rpush(key, msgid.toString());
+			jedis.expire(key, keysExpiresInSec);
 		} finally {
 			jedis.close();
 		}						
diff --git a/akka-bbb-apps/src/main/resources/application.conf b/akka-bbb-apps/src/main/resources/application.conf
index e1e8967123..ed9229b889 100755
--- a/akka-bbb-apps/src/main/resources/application.conf
+++ b/akka-bbb-apps/src/main/resources/application.conf
@@ -31,4 +31,6 @@ redis {
     host="127.0.0.1"
     port=6379
     password=""
+    # recording keys should expire in 14 days
+    keyExpiry=1209600
 }
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala
index 59d4c20981..6e981e1281 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala
@@ -25,7 +25,7 @@ object Boot extends App with SystemConfiguration {
   val redisPublisher = new RedisPublisher(system)
   val msgSender = new MessageSender(redisPublisher)
 
-  val redisDispatcher = new RedisDispatcher(redisHost, redisPort, redisPassword)
+  val redisDispatcher = new RedisDispatcher(redisHost, redisPort, redisPassword, keysExpiresInSec)
   val recorderApp = new RecorderApplication(redisDispatcher)
   recorderApp.start()
 
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/SystemConfiguration.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/SystemConfiguration.scala
index 663c885576..cb96d04538 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/SystemConfiguration.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/SystemConfiguration.scala
@@ -10,4 +10,5 @@ trait SystemConfiguration {
   lazy val redisHost = Try(config.getString("redis.host")).getOrElse("127.0.0.1")
   lazy val redisPort = Try(config.getInt("redis.port")).getOrElse(6379)
   lazy val redisPassword = Try(config.getString("redis.password")).getOrElse("")
+  lazy val keysExpiresInSec = Try(config.getInt("redis.keyExpiry")).getOrElse(14 * 86400) // 14 days
 }
\ No newline at end of file
diff --git a/bbb-video/src/main/java/org/bigbluebutton/app/video/EventRecordingService.java b/bbb-video/src/main/java/org/bigbluebutton/app/video/EventRecordingService.java
index 05e594aafd..ff9f49ecf4 100755
--- a/bbb-video/src/main/java/org/bigbluebutton/app/video/EventRecordingService.java
+++ b/bbb-video/src/main/java/org/bigbluebutton/app/video/EventRecordingService.java
@@ -28,10 +28,12 @@ public class EventRecordingService {
 	
 	private final String  host;
 	private final int port;
+	private final int keyExpiry;
 	
-	public EventRecordingService(String host, int port) {
+	public EventRecordingService(String host, int port, int keyExpiry) {
 		this.host = host;
 		this.port = port;
+		this.keyExpiry = keyExpiry;
 	}
 	
 	public void record(String meetingId, Map<String, String> event) {		
@@ -44,9 +46,9 @@ public class EventRecordingService {
 		 * recording the event into redis even if the meeting is not
 		 * recorded. (ralam sept 23, 2015) 
 		 */
-		jedis.expire(key, 14*24*60*60 /*14days*/);
+		jedis.expire(key, keyExpiry);
 		key = "meeting:" + meetingId + COLON + "recordings";
 		jedis.rpush(key, msgid.toString());	
-		jedis.expire(key, 14*24*60*60 /*14days*/);
+		jedis.expire(key, keyExpiry);
 	}
 }
diff --git a/bbb-video/src/main/webapp/WEB-INF/bigbluebutton-video.properties b/bbb-video/src/main/webapp/WEB-INF/bigbluebutton-video.properties
index c5307457dd..5f8030de0c 100755
--- a/bbb-video/src/main/webapp/WEB-INF/bigbluebutton-video.properties
+++ b/bbb-video/src/main/webapp/WEB-INF/bigbluebutton-video.properties
@@ -1,2 +1,4 @@
 redis.host=127.0.0.1
 redis.port=6379
+# recording keys should expire in 14 days
+redis.keyExpiry=1209600
diff --git a/bbb-video/src/main/webapp/WEB-INF/red5-web.xml b/bbb-video/src/main/webapp/WEB-INF/red5-web.xml
index 918f924882..d54025f793 100755
--- a/bbb-video/src/main/webapp/WEB-INF/red5-web.xml
+++ b/bbb-video/src/main/webapp/WEB-INF/red5-web.xml
@@ -59,6 +59,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 	<bean id="redisRecorder" class="org.bigbluebutton.app.video.EventRecordingService">
         <constructor-arg index="0" value="${redis.host}"/>
         <constructor-arg index="1" value="${redis.port}"/>
+        <constructor-arg index="2" value="${redis.keyExpiry}"/>
     </bean>	
     
     <bean id="redisSender" class="org.bigbluebutton.red5.pubsub.MessageSender" 
diff --git a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/recorder/EventRecorder.java b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/recorder/EventRecorder.java
index 2df5ef806d..37f8fa7bb6 100755
--- a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/recorder/EventRecorder.java
+++ b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/recorder/EventRecorder.java
@@ -30,10 +30,12 @@ public class EventRecorder implements RecordStatusListener {
 	private static final String COLON=":";
 	private String host;
 	private int port;
-
-	public EventRecorder(String host, int port){
+	private final int keyExpiry;
+	
+	public EventRecorder(String host, int port, int keyExpiry){
 		this.host = host;
 		this.port = port;		
+		this.keyExpiry = keyExpiry;
 	}
 	
   private Long genTimestamp() {
@@ -50,10 +52,10 @@ public class EventRecorder implements RecordStatusListener {
 		 * recording the event into redis even if the meeting is not
 		 * recorded. (ralam sept 23, 2015) 
 		 */
-		jedis.expire(key, 14*24*60*60 /*14days*/);
+		jedis.expire(key, keyExpiry);
 		key = "meeting" + COLON + session + COLON + "recordings";
 		jedis.rpush(key, msgid.toString());
-		jedis.expire(key, 14*24*60*60 /*14days*/);
+		jedis.expire(key, keyExpiry);
 	}
 	
 	@Override
diff --git a/deskshare/app/src/main/webapp/WEB-INF/deskshare.properties b/deskshare/app/src/main/webapp/WEB-INF/deskshare.properties
index f847481b99..355db0630c 100755
--- a/deskshare/app/src/main/webapp/WEB-INF/deskshare.properties
+++ b/deskshare/app/src/main/webapp/WEB-INF/deskshare.properties
@@ -13,7 +13,8 @@ recordingDirectory=/var/bigbluebutton/deskshare
 
 redis.host=127.0.0.1
 redis.port=6379
-
+# recording keys should expire in 14 days
+redis.keyExpiry=1209600
 
 serverPort = 9123
 
diff --git a/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml b/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml
index a2d0249da4..f83f636841 100755
--- a/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml
+++ b/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml
@@ -69,5 +69,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
   <bean id="redisRecorder" class="org.bigbluebutton.deskshare.server.recorder.EventRecorder">
     <constructor-arg index="0" value="${redis.host}"/>
     <constructor-arg index="1" value="${redis.port}"/>
+    <constructor-arg index="2" value="${redis.keyExpiry}"/>
   </bean>
 </beans>
-- 
GitLab