Skip to content

Commit 0ebf985

Browse files
author
Shane Myrick
committed
Clear cache of operations if no more left
Prioritize clearing memory over saving the small amount of operation we have to perform is the session stays open but there is no active operations
1 parent d764a00 commit 0ebf985

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

graphql-kotlin-spring-server/src/main/kotlin/com/expediagroup/graphql/spring/execution/ApolloSubscriptionSessionState.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ internal class ApolloSubscriptionSessionState {
5858
val operationsForSession = activeOperations[session.id]
5959
operationsForSession?.get(operationMessage.id)?.cancel()
6060
operationsForSession?.remove(operationMessage.id)
61+
62+
if (operationsForSession?.isEmpty() == true) {
63+
activeOperations.remove(session.id)
64+
}
6165
}
6266
}
6367

graphql-kotlin-spring-server/src/test/kotlin/com/expediagroup/graphql/spring/execution/ApolloSubscriptionSessionStateTest.kt

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import org.reactivestreams.Subscription
2525
import org.springframework.web.reactive.socket.WebSocketSession
2626
import reactor.core.publisher.Mono
2727
import kotlin.test.assertEquals
28+
import kotlin.test.assertNull
2829

2930
class ApolloSubscriptionSessionStateTest {
3031

@@ -131,7 +132,7 @@ class ApolloSubscriptionSessionStateTest {
131132
}
132133

133134
@Test
134-
fun `stopOperation cancels the subscription if operation id is valid`() {
135+
fun `stopOperation clears entire operation cache if it is empty after removal`() {
135136
val state = ApolloSubscriptionSessionState()
136137
val mockSubscription: Subscription = mockk { every { cancel() } returns Unit }
137138
val mockSession: WebSocketSession = mockk { every { id } returns "123" }
@@ -144,11 +145,33 @@ class ApolloSubscriptionSessionStateTest {
144145

145146
state.stopOperation(mockSession, inputOperation)
146147

147-
assertEquals(expected = 1, actual = state.activeOperations.size)
148-
assertEquals(expected = 0, actual = state.activeOperations["123"]?.size)
148+
assertEquals(expected = 0, actual = state.activeOperations.size)
149+
assertNull(state.activeOperations["123"])
149150
verify(exactly = 1) { mockSubscription.cancel() }
150151
}
151152

153+
@Test
154+
fun `stopOperation cancels the subscription if operation id is valid`() {
155+
val state = ApolloSubscriptionSessionState()
156+
val mockSession: WebSocketSession = mockk { every { id } returns "123" }
157+
val mockSubscription1: Subscription = mockk { every { cancel() } returns Unit }
158+
val mockSubscription2: Subscription = mockk { every { cancel() } returns Unit }
159+
val inputOperation1: SubscriptionOperationMessage = mockk { every { id } returns "abc" }
160+
val inputOperation2: SubscriptionOperationMessage = mockk { every { id } returns "def" }
161+
162+
state.saveOperation(mockSession, inputOperation1, mockSubscription1)
163+
state.saveOperation(mockSession, inputOperation2, mockSubscription2)
164+
165+
assertEquals(expected = 1, actual = state.activeOperations.size)
166+
assertEquals(expected = 2, actual = state.activeOperations["123"]?.size)
167+
168+
state.stopOperation(mockSession, inputOperation1)
169+
170+
assertEquals(expected = 1, actual = state.activeOperations.size)
171+
assertEquals(expected = 1, actual = state.activeOperations["123"]?.size)
172+
verify(exactly = 1) { mockSubscription1.cancel() }
173+
}
174+
152175
@Test
153176
fun `terminateSession cancels the keep alive subscription`() {
154177
val state = ApolloSubscriptionSessionState()

0 commit comments

Comments
 (0)