This is an automated email from the ASF dual-hosted git repository.
solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git
The following commit(s) were added to refs/heads/master by this push:
new 060a311 [OPENMEETINGS-2551] more work on client count
060a311 is described below
commit 060a3114ad759931aeb42cd9afa9d1ebb39d3075
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Fri Jan 29 23:13:41 2021 +0700
[OPENMEETINGS-2551] more work on client count
---
.../openmeetings/web/pages/InternalErrorPage.java | 4 +-
.../openmeetings/webservice/NetTestWebService.java | 82 +++++++++++-----------
.../webservice/util/RateLimitRequestFilter.java | 8 +++
3 files changed, 50 insertions(+), 44 deletions(-)
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InternalErrorPage.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InternalErrorPage.java
index 939b5d1..55a4664 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InternalErrorPage.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/InternalErrorPage.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.pages;
import org.apache.openmeetings.web.app.Application;
import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.IRequestParameters;
@@ -33,7 +33,7 @@ public class InternalErrorPage extends BaseInitedPage {
@Override
protected void onInitialize() {
super.onInitialize();
- add(new Form<Void>("form").add(
+ add(new StatelessForm<Void>("form").add(
new BootstrapButton("home", new
ResourceModel("124"), Buttons.Type.Outline_Primary) {
private static final long
serialVersionUID = 1L;
diff --git
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
index 0af9d02..44f0b50 100644
---
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
+++
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/NetTestWebService.java
@@ -33,7 +33,6 @@ import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import org.apache.openmeetings.webservice.util.RateLimited;
@@ -57,10 +56,8 @@ public class NetTestWebService {
private static final int PING_PACKET_SIZE = 64;
private static final int JITTER_PACKET_SIZE = 1024;
private static final int MAX_UPLOAD_SIZE = 16 * 1024 * 1024;
- private AtomicInteger clientCount = new AtomicInteger();
-
- @Value("${nettest.max.clients}")
- private int maxClients = 100;
+ public static final AtomicInteger CLIENT_COUNT = new AtomicInteger();
+ public static int maxClients = 100;
@PostConstruct
private void report() {
@@ -78,10 +75,6 @@ public class NetTestWebService {
if (TestType.UNKNOWN == testType) {
return Response.status(Status.BAD_REQUEST).build();
}
- if (clientCount.intValue() > maxClients) {
- log.error("Download: Max client count reached");
- return
Response.status(Status.TOO_MANY_REQUESTS).build();
- }
// choose data to send
switch (testType) {
@@ -92,38 +85,42 @@ public class NetTestWebService {
size = JITTER_PACKET_SIZE;
break;
default:
- clientCount.incrementAndGet();
+ final int count =
CLIENT_COUNT.incrementAndGet();
+ log.info("... download: client count: {}",
count);
size = inSize;
break;
}
- ResponseBuilder response =
Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).entity(new InputStream()
{
- int pos = 0;
-
- @Override
- public int read() throws IOException {
- pos++;
- return pos > size ? -1 :
ThreadLocalRandom.current().nextInt(0, 0xFF);
- }
-
- @Override
- public int available() throws IOException {
- return size - pos;
- }
-
- @Override
- public void close() throws IOException {
- if (TestType.DOWNLOAD_SPEED == testType) {
- clientCount.decrementAndGet();
- }
- super.close();
- }
- });
- response.header("Cache-Control", "no-cache, no-store,
no-transform");
- response.header("Pragma", "no-cache");
- response.header("Content-Length", String.valueOf(size));
- return response.build();
+ return Response.ok()
+
.type(MediaType.APPLICATION_OCTET_STREAM).entity(new InputStream() {
+ int pos = 0;
+
+ @Override
+ public int read() throws IOException {
+ pos++;
+ return pos > size ? -1 :
ThreadLocalRandom.current().nextInt(0, 0xFF);
+ }
+
+ @Override
+ public int available() throws
IOException {
+ return size - pos;
+ }
+
+ @Override
+ public void close() throws IOException {
+ if (TestType.DOWNLOAD_SPEED ==
testType) {
+ final int count =
CLIENT_COUNT.decrementAndGet();
+ log.info("... close:
client count: {}", count);
+ }
+ super.close();
+ }
+ })
+ .header("Cache-Control", "no-cache, no-store,
no-transform")
+ .header("Pragma", "no-cache")
+ .header("Content-Length", String.valueOf(size))
+ .build();
}
+ @RateLimited
@POST
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
@Path("/")
@@ -131,11 +128,7 @@ public class NetTestWebService {
if (size > MAX_UPLOAD_SIZE) {
return;
}
- if (clientCount.intValue() > maxClients) {
- log.error("Upload: Max client count reached");
- return;
- }
- clientCount.incrementAndGet();
+ CLIENT_COUNT.incrementAndGet();
byte[] b = new byte[1024];
int totalCount = 0;
int count;
@@ -145,7 +138,7 @@ public class NetTestWebService {
}
log.debug("Total bytes read {}", totalCount);
} finally {
- clientCount.decrementAndGet();
+ CLIENT_COUNT.decrementAndGet();
}
}
@@ -162,4 +155,9 @@ public class NetTestWebService {
return TestType.UNKNOWN;
}
+
+ @Value("${nettest.max.clients}")
+ private void setMaxClients(int count) {
+ maxClients = count;
+ }
}
diff --git
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java
index 89d51ae..2d071c2 100644
---
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java
+++
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/RateLimitRequestFilter.java
@@ -30,9 +30,12 @@ import javax.ws.rs.core.Response.Status;
import org.apache.openmeetings.webservice.NetTestWebService;
import org.apache.openmeetings.webservice.NetTestWebService.TestType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
@RateLimited
public class RateLimitRequestFilter implements ContainerRequestFilter {
+ private static final Logger log =
LoggerFactory.getLogger(RateLimitRequestFilter.class);
private static final String ATTR_LAST_ACCESS_TIME = "LAST_ACCESS_TIME";
private static final long ALLOWED_TIME = 3000;
@@ -53,6 +56,11 @@ public class RateLimitRequestFilter implements
ContainerRequestFilter {
return;
}
}
+ if (NetTestWebService.CLIENT_COUNT.get() >
NetTestWebService.maxClients) {
+ log.error("Download: Max client count reached");
+
context.abortWith(Response.status(Status.TOO_MANY_REQUESTS).build());
+ return;
+ }
Long lastAccessed =
(Long)session.getAttribute(ATTR_LAST_ACCESS_TIME);
session.setAttribute(ATTR_LAST_ACCESS_TIME,
System.currentTimeMillis());
if (lastAccessed != null && System.currentTimeMillis() -
lastAccessed.longValue() < ALLOWED_TIME) {