Skip to content

Commit eb3db00

Browse files
author
innokenty
committed
calculate sessions separately for each browser/version
1 parent 42558eb commit eb3db00

File tree

12 files changed

+261
-146
lines changed

12 files changed

+261
-146
lines changed

proxy/src/main/java/ru/qatools/gridrouter/ProxyServlet.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.springframework.beans.factory.annotation.Autowired;
99
import ru.qatools.gridrouter.json.JsonMessage;
1010
import ru.qatools.gridrouter.json.JsonMessageFactory;
11+
import ru.qatools.gridrouter.sessions.SessionStorage;
1112

1213
import javax.servlet.ServletConfig;
1314
import javax.servlet.ServletException;

proxy/src/main/java/ru/qatools/gridrouter/RouteServlet.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import ru.qatools.gridrouter.json.JsonCapabilities;
2121
import ru.qatools.gridrouter.json.JsonMessage;
2222
import ru.qatools.gridrouter.json.JsonMessageFactory;
23+
import ru.qatools.gridrouter.sessions.SessionStorage;
2324

2425
import javax.servlet.ServletConfig;
2526
import javax.servlet.ServletException;
@@ -123,7 +124,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
123124
replyWithOk(hubMessage, response);
124125
LOGGER.info("[SESSION_CREATED] [{}] [{}] [{}] [{}] [{}] [{}]",
125126
user, remoteHost, browser, route, sessionId, attempt);
126-
sessionStorage.put(hubMessage.getSessionId(), user);
127+
sessionStorage.put(hubMessage.getSessionId(), user, browser, actualVersion.getNumber());
127128
return;
128129
}
129130
LOGGER.warn("[SESSION_FAILED] [{}] [{}] [{}] [{}] - {}",

proxy/src/main/java/ru/qatools/gridrouter/SessionStorageEvictionScheduler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.springframework.context.annotation.Configuration;
66
import org.springframework.scheduling.annotation.EnableScheduling;
77
import org.springframework.scheduling.annotation.Scheduled;
8+
import ru.qatools.gridrouter.sessions.SessionStorage;
89

910
import java.time.Duration;
1011

proxy/src/main/java/ru/qatools/gridrouter/StatsServlet.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import org.apache.commons.io.IOUtils;
44
import org.springframework.beans.factory.annotation.Autowired;
5+
import ru.qatools.gridrouter.json.JsonFormatter;
6+
import ru.qatools.gridrouter.sessions.SessionStorage;
57

68
import javax.servlet.ServletConfig;
79
import javax.servlet.ServletException;
@@ -16,7 +18,7 @@
1618

1719
import static java.nio.charset.StandardCharsets.UTF_8;
1820
import static javax.servlet.http.HttpServletResponse.SC_OK;
19-
import static org.springframework.http.MediaType.TEXT_PLAIN_VALUE;
21+
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
2022
import static org.springframework.web.context.support.SpringBeanAutowiringSupport.processInjectionBasedOnServletContext;
2123

2224
/**
@@ -39,10 +41,11 @@ public void init(ServletConfig config) throws ServletException {
3941
protected void doGet(HttpServletRequest request, HttpServletResponse response)
4042
throws ServletException, IOException {
4143
response.setStatus(SC_OK);
42-
response.setContentType(TEXT_PLAIN_VALUE);
44+
response.setContentType(APPLICATION_JSON_VALUE);
4345
try (OutputStream output = response.getOutputStream()) {
44-
int count = sessionStorage.getCountFor(request.getRemoteUser());
45-
IOUtils.write(String.valueOf(count), output, UTF_8);
46+
IOUtils.write(JsonFormatter.toJson(
47+
sessionStorage.getBrowsersCountFor(request.getRemoteUser())
48+
), output, UTF_8);
4649
}
4750
}
4851
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package ru.qatools.gridrouter.sessions;
2+
3+
/**
4+
* @author Innokenty Shuvalov [email protected]
5+
*/
6+
public class BrowserVersion {
7+
8+
private final String browser;
9+
private final String version;
10+
11+
public BrowserVersion(String browser, String version) {
12+
this.browser = browser;
13+
this.version = version;
14+
}
15+
16+
public String getBrowser() {
17+
return browser;
18+
}
19+
20+
public String getVersion() {
21+
return version;
22+
}
23+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package ru.qatools.gridrouter.sessions;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.Optional;
6+
7+
/**
8+
* @author Innokenty Shuvalov [email protected]
9+
*/
10+
public class BrowsersCountMap extends HashMap<String, Map<String, Integer>> {
11+
12+
public void increment(String browser, String version) {
13+
putIfAbsent(browser, new HashMap<>());
14+
get(browser).compute(version, (v, count) -> Optional.ofNullable(count).orElse(0) + 1);
15+
}
16+
17+
public void decrement(BrowserVersion browser) {
18+
decrement(browser.getBrowser(), browser.getVersion());
19+
}
20+
21+
public void decrement(String browser, String version) {
22+
if (!containsKey(browser)) {
23+
return;
24+
}
25+
26+
Map<String, Integer> versions = get(browser);
27+
if (!versions.containsKey(version)) {
28+
return;
29+
}
30+
31+
int count = versions.get(version) - 1;
32+
if (count > 0) {
33+
versions.put(version, count);
34+
} else {
35+
versions.remove(version);
36+
}
37+
38+
if (versions.isEmpty()) {
39+
remove(browser);
40+
}
41+
}
42+
}

proxy/src/main/java/ru/qatools/gridrouter/MemorySessionStorage.java renamed to proxy/src/main/java/ru/qatools/gridrouter/sessions/MemorySessionStorage.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
package ru.qatools.gridrouter;
1+
package ru.qatools.gridrouter.sessions;
22

33
import java.time.Duration;
44
import java.time.temporal.Temporal;
55
import java.util.HashMap;
66
import java.util.List;
77
import java.util.Map;
8-
import java.util.Optional;
98

109
import static java.time.ZonedDateTime.now;
1110
import static java.util.stream.Collectors.toList;
@@ -16,14 +15,17 @@
1615
public class MemorySessionStorage implements SessionStorage {
1716

1817
private final Map<String, Temporal> session2instant = new HashMap<>();
19-
private final Map<String, Integer> user2count = new HashMap<>();
20-
private final Map<String, String> session2user = new HashMap<>();
18+
private final Map<String, String> session2user = new HashMap<>();
19+
private final Map<String, BrowserVersion> session2browserVersion = new HashMap<>();
20+
private final Map<String, BrowsersCountMap> user2browserCount = new HashMap<>();
2121

2222
@Override
23-
public synchronized void put(String sessionId, String user) {
23+
public synchronized void put(String sessionId, String user, String browser, String version) {
2424
if (session2instant.put(sessionId, now()) == null) {
25-
user2count.compute(user, (k, count) -> Optional.ofNullable(count).orElse(0) + 1);
2625
session2user.put(sessionId, user);
26+
session2browserVersion.put(sessionId, new BrowserVersion(browser, version));
27+
user2browserCount.putIfAbsent(user, new BrowsersCountMap());
28+
user2browserCount.get(user).increment(browser, version);
2729
}
2830
}
2931

@@ -36,7 +38,8 @@ public void update(String sessionId) {
3638
public synchronized void remove(String sessionId) {
3739
if (session2instant.remove(sessionId) != null) {
3840
String user = session2user.remove(sessionId);
39-
user2count.compute(user, (k, count) -> count - 1);
41+
BrowserVersion browser = session2browserVersion.remove(sessionId);
42+
user2browserCount.get(user).decrement(browser);
4043
}
4144
}
4245

@@ -51,7 +54,7 @@ public synchronized List<String> expireSessionsOlderThan(Duration duration) {
5154
}
5255

5356
@Override
54-
public synchronized int getCountFor(String user) {
55-
return user2count.getOrDefault(user, 0);
57+
public synchronized BrowsersCountMap getBrowsersCountFor(String user) {
58+
return user2browserCount.getOrDefault(user, new BrowsersCountMap());
5659
}
5760
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ru.qatools.gridrouter;
1+
package ru.qatools.gridrouter.sessions;
22

33
import java.time.Duration;
44
import java.util.List;
@@ -8,13 +8,13 @@
88
*/
99
public interface SessionStorage {
1010

11-
void put(String sessionId, String user);
11+
void put(String sessionId, String user, String browser, String version);
1212

1313
void update(String sessionId);
1414

1515
void remove(String sessionId);
1616

1717
List<String> expireSessionsOlderThan(Duration duration);
1818

19-
int getCountFor(String user);
19+
BrowsersCountMap getBrowsersCountFor(String user);
2020
}

proxy/src/main/resources/META-INF/spring/application-context.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@
1919

2020
<bean id="hostSelectionStrategy" class="ru.qatools.gridrouter.config.RandomHostSelectionStrategy"/>
2121

22-
<bean class="ru.qatools.gridrouter.MemorySessionStorage"/>
22+
<bean class="ru.qatools.gridrouter.sessions.MemorySessionStorage"/>
2323

2424
</beans>

proxy/src/test/java/ru/qatools/gridrouter/MemorySessionStorageTest.java

Lines changed: 0 additions & 118 deletions
This file was deleted.

0 commit comments

Comments
 (0)