diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SessionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SessionServiceImpl.java index b476fd1db6f3..522e67f2f7a0 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SessionServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SessionServiceImpl.java @@ -71,7 +71,7 @@ public Session createSessionIfAbsent(User user) { } } session = sessionList.get(0); - if (isSessionExpire(session)) { + if (!isSessionExpire(session)) { session.setLastLoginTime(new Date()); sessionDao.updateById(session); return session; diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SessionServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SessionServiceTest.java index 659900306956..383ac73b3c54 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SessionServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SessionServiceTest.java @@ -120,6 +120,42 @@ public void testIsSessionExpireUsesConfiguredTimeout() { Assertions.assertTrue(sessionService.isSessionExpire(expired)); } + @Test + public void testCreateSessionIfAbsentReusesUnexpiredSession() { + User user = new User(); + user.setUserType(UserType.GENERAL_USER); + user.setId(1); + // fixture session's lastLoginTime is 40 days in the future -> unexpired + Mockito.when(sessionDao.queryByUserId(1)).thenReturn(getSessions()); + + Session session = sessionService.createSessionIfAbsent(user); + + Assertions.assertNotNull(session); + Assertions.assertEquals(sessionId, session.getId()); + Mockito.verify(sessionDao).updateById(session); + Mockito.verify(sessionDao, Mockito.never()).deleteById(Mockito.anyString()); + Mockito.verify(sessionDao, Mockito.never()).insert(Mockito.any(Session.class)); + } + + @Test + public void testCreateSessionIfAbsentReplacesExpiredSession() { + User user = new User(); + user.setUserType(UserType.GENERAL_USER); + user.setId(1); + Session expired = getSession(); + expired.setLastLoginTime(DateUtils.add(new Date(), Calendar.DAY_OF_MONTH, -40)); + List sessions = new ArrayList<>(); + sessions.add(expired); + Mockito.when(sessionDao.queryByUserId(1)).thenReturn(sessions); + + Session session = sessionService.createSessionIfAbsent(user); + + Assertions.assertNotNull(session); + Assertions.assertNotEquals(sessionId, session.getId()); + Mockito.verify(sessionDao).deleteById(sessionId); + Mockito.verify(sessionDao).insert(Mockito.any(Session.class)); + } + private Session getSession() { Session session = new Session(); session.setId(sessionId);