You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2021/01/29 16:13:56 UTC
[openmeetings] branch master updated: [OPENMEETINGS-2551] more work
on client count
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 <so...@gmail.com>
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) {