From 607c465101407ff0715c19a85e2b63dabd5d05c2 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 26 Apr 2018 13:04:13 -0400 Subject: [PATCH] update check: set read timeout on socket, move off of request thread Update check was hung on read(), which holds a lock causing all other requests for update status to wait --- .../service/updatecheck/UpdateCheckService.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/http-service/src/main/java/net/runelite/http/service/updatecheck/UpdateCheckService.java b/http-service/src/main/java/net/runelite/http/service/updatecheck/UpdateCheckService.java index cce863309b..4bbc968d5a 100644 --- a/http-service/src/main/java/net/runelite/http/service/updatecheck/UpdateCheckService.java +++ b/http-service/src/main/java/net/runelite/http/service/updatecheck/UpdateCheckService.java @@ -24,7 +24,6 @@ */ package net.runelite.http.service.updatecheck; -import com.google.common.base.Suppliers; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -36,8 +35,6 @@ import java.nio.ByteBuffer; import java.time.Duration; import java.util.List; import java.util.Random; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.worlds.World; import net.runelite.http.api.worlds.WorldResult; @@ -45,6 +42,7 @@ import net.runelite.http.service.worlds.WorldsService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -63,7 +61,7 @@ public class UpdateCheckService private static final int RESPONSE_OUTDATED = 6; private final WorldsService worldsService; - private final Supplier updateAvailable = Suppliers.memoizeWithExpiration(this::checkUpdate, 1, TimeUnit.MINUTES); + private boolean updateAvailable; @Autowired public UpdateCheckService(WorldsService worldsService) @@ -74,7 +72,13 @@ public class UpdateCheckService @RequestMapping public Boolean check() { - return updateAvailable.get(); + return updateAvailable; + } + + @Scheduled(fixedDelay = 60_000) + public void scheduledCheck() + { + updateAvailable = checkUpdate(); } private boolean checkUpdate() @@ -99,6 +103,7 @@ public class UpdateCheckService try (Socket socket = new Socket()) { + socket.setSoTimeout((int) TIMEOUT.toMillis()); socket.connect(new InetSocketAddress(address, PORT), (int) TIMEOUT.toMillis()); ByteBuffer buffer = ByteBuffer.allocate(5);