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) {