Skip to content

Commit

Permalink
Version 1.2.10, adaguc-server queue is now atomic
Browse files Browse the repository at this point in the history
  • Loading branch information
maartenplieger committed May 19, 2020
1 parent 695daf6 commit 3a11427
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 40 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>nl.knmi.adagucservices</groupId>
<artifactId>adaguc-services</artifactId>
<version>1.2.9</version>
<version>1.2.10</version>

<name>adaguc-services</name>
<description>Backend for adaguc-server and adaguc-viewer</description>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
Expand Down Expand Up @@ -78,8 +79,8 @@ enum ADAGUCServiceType {
WMS, WCS, OPENDAP
}

private static int numInstancesRunning = 0;
private static int numInstancesInQue = 0;
private static AtomicInteger numInstancesRunning = new AtomicInteger(0);
private static AtomicInteger numInstancesInQue = new AtomicInteger(0);

public static void runADAGUC(HttpServletRequest request, HttpServletResponse response, String queryString,
OutputStream outputStream, ADAGUCServiceType serviceType) throws Exception {
Expand All @@ -89,7 +90,7 @@ public static void runADAGUC(HttpServletRequest request, HttpServletResponse res
Exception exception = null;
String instanceId = UUID.randomUUID().toString();

if (maxInstancesInQueue > 0 && numInstancesInQue > maxInstancesInQueue) {
if (maxInstancesInQueue > 0 && numInstancesInQue.get() > maxInstancesInQueue) {

String msg = "[ADAGUC-Server] Queue limit [" + maxInstancesInQueue + "] exceeded";
Debug.errprintln(msg);
Expand All @@ -101,33 +102,33 @@ public static void runADAGUC(HttpServletRequest request, HttpServletResponse res

try {
if (maxInstances > 0 && maxInstancesInQueue > 0) {
if (numInstancesRunning >= maxInstances) {
Debug.println("[ADAGUC-Server] Too many instances running, Queued: [" + numInstancesInQue + "], Running: ["
+ numInstancesRunning + "]");
if (numInstancesRunning.get() >= maxInstances) {
Debug.println("[ADAGUC-Server] Too many instances running, Queued: [" + numInstancesInQue.get()
+ "], Running: [" + numInstancesRunning + "]");
}
if (maxInstancesInQueue > 0)
numInstancesInQue++;
numInstancesInQue.getAndIncrement();
try {
while (numInstancesRunning >= maxInstances) {
while (numInstancesRunning.get() >= maxInstances) {
Thread.sleep(100);
}
} catch (Exception e) {
exception = e;
}
if (maxInstancesInQueue > 0)
numInstancesInQue--;
numInstancesInQue.getAndDecrement();
}
} catch (Exception e) {
exception = e;
}
if (exception == null) {
numInstancesRunning++;
numInstancesRunning.getAndIncrement();
try {
_runADAGUC(request, response, queryString, outputStream, serviceType, instanceId);
} catch (Exception e) {
exception = e;
}
numInstancesRunning--;
numInstancesRunning.getAndDecrement();
}

if (exception != null)
Expand Down Expand Up @@ -249,25 +250,26 @@ private static void _runADAGUC(HttpServletRequest request, HttpServletResponse r
}
}

public static void runADAGUC(String userHomeDir, String [] args, OutputStream outputStream)
public static void runADAGUC(String userHomeDir, String[] args, OutputStream outputStream)
throws IOException, ElementNotFoundException, InterruptedException {
String instanceId = UUID.randomUUID().toString();
List<String> environmentVariables = new ArrayList<String>();
String tmpDir = userHomeDir+"/adaguctmp/";
String tmpDir = userHomeDir + "/adaguctmp/";
Tools.mksubdirs(tmpDir);
environmentVariables.add("ADAGUC_TMP="+tmpDir);
environmentVariables.add("ADAGUC_TMP=" + tmpDir);
String tmpLogFile = tmpDir + "adaguc-server-cmd-log" + instanceId;
Debug.println("Logging to " + tmpLogFile);
environmentVariables.add("ADAGUC_LOGFILE=" + tmpLogFile);
environmentVariables.add("HOME="+userHomeDir);
environmentVariables.add("HOME=" + userHomeDir);

String[] configEnv = ADAGUCConfigurator.getADAGUCEnvironment();
if(configEnv == null){
if (configEnv == null) {
Debug.println("ADAGUC environment is not configured");
}else{
for(int j=0;j<configEnv.length;j++){
if (!configEnv[j].startsWith("ADAGUC_LOGFILE") && !configEnv[j].startsWith("ADAGUC_TMP") && !configEnv[j].startsWith("ADAGUC_ONLINERESOURCE")) {
environmentVariables.add(configEnv[j]);
} else {
for (int j = 0; j < configEnv.length; j++) {
if (!configEnv[j].startsWith("ADAGUC_LOGFILE") && !configEnv[j].startsWith("ADAGUC_TMP")
&& !configEnv[j].startsWith("ADAGUC_ONLINERESOURCE")) {
environmentVariables.add(configEnv[j]);
} else {
Debug.errprintln("[WARNING]: Environment " + configEnv[j] + " is controlled by adaguc-services.");
}
Expand All @@ -276,18 +278,26 @@ public static void runADAGUC(String userHomeDir, String [] args, OutputStream ou
String adagucExecutableLocation = ADAGUCConfigurator.getADAGUCExecutable();
List<String> commands = new ArrayList<String>();
commands.add(adagucExecutableLocation);
for(int j=0;j<args.length;j++){
for (int j = 0; j < args.length; j++) {
commands.add(args[j]);
}

String[] environmentVariablesAsArray = new String[ environmentVariables.size() ];
environmentVariables.toArray( environmentVariablesAsArray );
String[] environmentVariablesAsArray = new String[environmentVariables.size()];
environmentVariables.toArray(environmentVariablesAsArray);
long timeOutMs = ADAGUCConfigurator.getTimeOut();

class StdoutPrinter implements ProcessRunner.StatusPrinterInterface{
public void setError(String message) {}
public String getError() { return null; }
public boolean hasData() { return false; }

class StdoutPrinter implements ProcessRunner.StatusPrinterInterface {
public void setError(String message) {
}

public String getError() {
return null;
}

public boolean hasData() {
return false;
}

public void print(byte[] message, int bytesRead) {
try {
outputStream.write(message, 0, bytesRead);
Expand All @@ -296,7 +306,8 @@ public void print(byte[] message, int bytesRead) {
}
}
}
ProcessRunner processRunner = new ProcessRunner (new StdoutPrinter(),new StdoutPrinter(),environmentVariablesAsArray,userHomeDir, timeOutMs);
ProcessRunner processRunner = new ProcessRunner(new StdoutPrinter(), new StdoutPrinter(),
environmentVariablesAsArray, userHomeDir, timeOutMs);
processRunner.runProcess(commands.toArray(new String[0]), null);
try {
Tools.rmfile(tmpLogFile);
Expand All @@ -305,16 +316,17 @@ public void print(byte[] message, int bytesRead) {
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
doGet(request, response);
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
Debug.println("Handle ADAGUC WMS requests");
OutputStream out1 = null;
//response.setContentType("application/json");
// response.setContentType("application/json");
try {
out1 = response.getOutputStream();
} catch (IOException e) {
Expand All @@ -323,7 +335,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) {
}

try {
ADAGUCServer.runADAGUCWMS(request,response,request.getQueryString(),out1);
ADAGUCServer.runADAGUCWMS(request, response, request.getQueryString(), out1);

} catch (Exception e) {
response.setStatus(401);
Expand All @@ -333,17 +345,20 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) {
Debug.errprintln("Unable to write to stream");
Debug.printStackTrace(e);
}
}
}
}
public static void runADAGUCOpenDAP(HttpServletRequest request,HttpServletResponse response,String queryString,OutputStream outputStream) throws Exception {
runADAGUC(request,response, queryString, outputStream, ADAGUCServiceType.OPENDAP);

public static void runADAGUCOpenDAP(HttpServletRequest request, HttpServletResponse response, String queryString,
OutputStream outputStream) throws Exception {
runADAGUC(request, response, queryString, outputStream, ADAGUCServiceType.OPENDAP);
}

public static int getNumInstancesInQueue() {
return numInstancesInQue;
return numInstancesInQue.get();
}

public static int getNumInstancesRunning() {
return numInstancesRunning;
return numInstancesRunning.get();
}


}

0 comments on commit 3a11427

Please sign in to comment.