This is an automated email from the ASF dual-hosted git repository.

leebai pushed a commit to branch dev-1.0.3
in repository https://gitbox.apache.org/repos/asf/incubator-linkis.git


The following commit(s) were added to refs/heads/dev-1.0.3 by this push:
     new d1b08da  Fix this issue that  memory leak problem of SSO login close 
#1138
     new bcfe438  Merge pull request #1234 from peacewong/dev-1.0.3-sso
d1b08da is described below

commit d1b08da972d4f6a22b5271166ba141b4b69b5636
Author: peacewong <[email protected]>
AuthorDate: Fri Dec 24 10:24:30 2021 +0800

    Fix this issue that  memory leak problem of SSO login close #1138
---
 .../apache/linkis/server/security/SSOUtils.scala   | 51 ++++++++++++----------
 1 file changed, 29 insertions(+), 22 deletions(-)

diff --git 
a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala
 
b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala
index c192115..fbd32bd 100644
--- 
a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala
+++ 
b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala
@@ -17,8 +17,7 @@
  
 package org.apache.linkis.server.security
 
-import java.util
-import java.util.concurrent.TimeUnit
+import java.util.concurrent.{ConcurrentHashMap, TimeUnit}
 
 import org.apache.linkis.common.conf.Configuration
 import org.apache.linkis.common.utils.{Logging, RSAUtils, Utils}
@@ -26,29 +25,37 @@ import org.apache.linkis.server.conf.ServerConfiguration
 import org.apache.linkis.server.exception.{IllegalUserTicketException, 
LoginExpireException, NonLoginException}
 import javax.servlet.http.Cookie
 import org.apache.commons.lang.time.DateFormatUtils
-
-import scala.collection.JavaConversions
+import scala.collection.JavaConverters._
 
 object SSOUtils extends Logging {
 
   private[security] val USER_TICKET_ID_STRING = "bdp-user-ticket-id"
+
   private val sessionTimeout = 
ServerConfiguration.BDP_SERVER_WEB_SESSION_TIMEOUT.getValue.toLong
-  private val userTicketIdToLastAccessTime = new util.HashMap[String, Long]()
+
+  private val userTicketIdToLastAccessTime = new ConcurrentHashMap[String, 
Long]()
+
   val sslEnable: Boolean = ServerConfiguration.BDP_SERVER_SECURITY_SSL.getValue
-  def decryptLogin(passwordString: String): String = if(sslEnable) {
+
+  def decryptLogin(passwordString: String): String = if (sslEnable) {
     new String(RSAUtils.decrypt(passwordString), 
Configuration.BDP_ENCODING.getValue)
   } else passwordString
 
   Utils.defaultScheduler.scheduleAtFixedRate(new Runnable {
-    override def run(): Unit = 
JavaConversions.mapAsScalaMap(userTicketIdToLastAccessTime).filter(System.currentTimeMillis
 - _._2 > sessionTimeout).foreach {
-      case (k, v) => if(userTicketIdToLastAccessTime.containsKey(k)) 
userTicketIdToLastAccessTime synchronized {
-        if(userTicketIdToLastAccessTime.containsKey(k) && 
System.currentTimeMillis - userTicketIdToLastAccessTime.get(k) > 
sessionTimeout) {
-          info(s"remove timeout userTicket $k, since the last access time is 
${DateFormatUtils.format(v, "yyyy-MM-dd HH:mm:ss")}.")
-          userTicketIdToLastAccessTime.remove(k)
+    override def run(): Unit = Utils.tryCatch {
+     userTicketIdToLastAccessTime.asScala.filter(System.currentTimeMillis - 
_._2 > sessionTimeout).foreach {
+        case (k, v) => if (userTicketIdToLastAccessTime.containsKey(k)) {
+          if (userTicketIdToLastAccessTime.containsKey(k) && 
System.currentTimeMillis - userTicketIdToLastAccessTime.get(k) > 
sessionTimeout) {
+            info(s"remove timeout userTicket $k, since the last access time is 
${DateFormatUtils.format(v, "yyyy-MM-dd HH:mm:ss")}.")
+            userTicketIdToLastAccessTime.remove(k)
+          }
         }
       }
+    } {
+      t => logger.error("failed to do remove", t)
     }
-  }, sessionTimeout, sessionTimeout/10, TimeUnit.MILLISECONDS)
+  }, sessionTimeout, sessionTimeout / 10, TimeUnit.MILLISECONDS
+  )
 
   private[security] def getUserAndLoginTime(userTicketId: String): 
Option[(String, Long)] = {
     ServerConfiguration.getUsernameByTicket(userTicketId).map { 
userAndLoginTime =>
@@ -67,7 +74,7 @@ object SSOUtils extends Logging {
   def setLoginUser(addCookie: Cookie => Unit, username: String): Unit = {
     info(s"add login userTicketCookie for user $username.")
     val userTicketId = getUserTicketId(username)
-    userTicketIdToLastAccessTime synchronized 
userTicketIdToLastAccessTime.put(userTicketId, System.currentTimeMillis())
+    userTicketIdToLastAccessTime.put(userTicketId, System.currentTimeMillis())
     val cookie = new Cookie(USER_TICKET_ID_STRING, userTicketId)
     cookie.setMaxAge(-1)
     if(sslEnable) cookie.setSecure(true)
@@ -78,7 +85,7 @@ object SSOUtils extends Logging {
   def setLoginUser(addUserTicketKV: (String, String) => Unit, username: 
String): Unit = {
     info(s"add login userTicket for user $username.")
     val userTicketId = getUserTicketKV(username)
-    userTicketIdToLastAccessTime synchronized 
userTicketIdToLastAccessTime.put(userTicketId._2, System.currentTimeMillis())
+    userTicketIdToLastAccessTime.put(userTicketId._2, 
System.currentTimeMillis())
     addUserTicketKV(userTicketId._1, userTicketId._2)
   }
 
@@ -90,8 +97,8 @@ object SSOUtils extends Logging {
   def removeLoginUser(getCookies: => Array[Cookie]): Unit = {
     val cookies = getCookies
     if(cookies != null) cookies.find(_.getName == 
USER_TICKET_ID_STRING).foreach { cookie =>
-      if(userTicketIdToLastAccessTime.containsKey(cookie.getValue)) 
userTicketIdToLastAccessTime synchronized {
-        if(userTicketIdToLastAccessTime.containsKey(cookie.getValue)) 
userTicketIdToLastAccessTime.remove(cookie.getValue)
+      if (userTicketIdToLastAccessTime.containsKey(cookie.getValue)) {
+        userTicketIdToLastAccessTime.remove(cookie.getValue)
       }
       cookie.setValue(null)
       cookie.setMaxAge(0)
@@ -107,8 +114,8 @@ object SSOUtils extends Logging {
   }
 
   def removeLoginUser(removeKeyReturnValue: String => Option[String]): Unit = 
removeKeyReturnValue(USER_TICKET_ID_STRING).foreach{ t =>
-    if(userTicketIdToLastAccessTime.containsKey(t)) 
userTicketIdToLastAccessTime synchronized {
-      if(userTicketIdToLastAccessTime.containsKey(t)) 
userTicketIdToLastAccessTime.remove(t)
+    if (userTicketIdToLastAccessTime.containsKey(t)) {
+       userTicketIdToLastAccessTime.remove(t)
     }
   }
 
@@ -130,16 +137,16 @@ object SSOUtils extends Logging {
 
   def updateLastAccessTime(getUserTicketId: String => Option[String]): Unit = 
getUserTicketId(USER_TICKET_ID_STRING).foreach(isTimeoutOrNot)
 
-  private def isTimeoutOrNot(userTicketId: String): Unit = 
if(!userTicketIdToLastAccessTime.containsKey(userTicketId)) {
+  private def isTimeoutOrNot(userTicketId: String): Unit = if 
(!userTicketIdToLastAccessTime.containsKey(userTicketId)) {
     throw new LoginExpireException("You are not logged in, please login 
first!(您尚未登录,请先登录!)")
   } else {
     val lastAccessTime = userTicketIdToLastAccessTime.get(userTicketId)
-    if(System.currentTimeMillis - lastAccessTime > sessionTimeout && 
!Configuration.IS_TEST_MODE.getValue) userTicketIdToLastAccessTime synchronized 
{
-      if(userTicketIdToLastAccessTime.containsKey(userTicketId) && 
System.currentTimeMillis - userTicketIdToLastAccessTime.get(userTicketId) > 
sessionTimeout) {
+    if (System.currentTimeMillis - lastAccessTime > sessionTimeout && 
!Configuration.IS_TEST_MODE.getValue) {
+      if (userTicketIdToLastAccessTime.containsKey(userTicketId) && 
System.currentTimeMillis - userTicketIdToLastAccessTime.get(userTicketId) > 
sessionTimeout) {
         userTicketIdToLastAccessTime.remove(userTicketId)
         throw new LoginExpireException("Login has expired, please log in 
again!(登录已过期,请重新登录!)")
       }
-    } else if(System.currentTimeMillis - lastAccessTime >= sessionTimeout * 
0.5) userTicketIdToLastAccessTime synchronized {
+    } else if (System.currentTimeMillis - lastAccessTime >= sessionTimeout * 
0.5) {
       userTicketIdToLastAccessTime.put(userTicketId, System.currentTimeMillis)
     }
   }

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to