From 51fe22830c51a1cb04765d84d30531db38760ca9 Mon Sep 17 00:00:00 2001
From: Costin Grigoras <Costin.Grigoras@cern.ch>
Date: Sat, 8 Apr 2023 08:04:57 +0200
Subject: [PATCH] Query timeouts and only cache confirmed DB operations

---
 src/main/java/alien/api/catalogue/GetAliEnv.java | 9 +++++++--
 src/main/java/alien/api/catalogue/SetAliEnv.java | 8 ++++++--
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/main/java/alien/api/catalogue/GetAliEnv.java b/src/main/java/alien/api/catalogue/GetAliEnv.java
index f1c6f8140..fdf3db406 100644
--- a/src/main/java/alien/api/catalogue/GetAliEnv.java
+++ b/src/main/java/alien/api/catalogue/GetAliEnv.java
@@ -48,7 +48,12 @@ public class GetAliEnv extends Request implements Cacheable {
 	public void run() {
 		try (DBFunctions db = ConfigUtils.getDB("admin")) {
 			if (db != null) {
-				db.query("SELECT cachedOutput FROM alienv_cache WHERE packageNames=? AND keyModifier=? AND expires>UNIX_TIMESTAMP();", false, packageNames, keyModifier);
+				db.setQueryTimeout(15);
+				if (!db.query("SELECT cachedOutput FROM alienv_cache WHERE packageNames=? AND keyModifier=? AND expires>UNIX_TIMESTAMP();", false, packageNames, keyModifier)) {
+					cachedAliEnvOutput = null;
+					monitor.incrementCounter("alienv_query_error");
+					return;
+				}
 
 				if (db.moveNext()) {
 					cachedAliEnvOutput = db.gets(1);
@@ -72,7 +77,7 @@ public class GetAliEnv extends Request implements Cacheable {
 
 	@Override
 	public long getTimeout() {
-		return 1000 * 60 * 60;
+		return 1000 * 60 * (cachedAliEnvOutput != null ? 60 : 0);
 	}
 
 	@Override
diff --git a/src/main/java/alien/api/catalogue/SetAliEnv.java b/src/main/java/alien/api/catalogue/SetAliEnv.java
index ffbf791ac..693c07daf 100644
--- a/src/main/java/alien/api/catalogue/SetAliEnv.java
+++ b/src/main/java/alien/api/catalogue/SetAliEnv.java
@@ -25,6 +25,7 @@ public class SetAliEnv extends Request implements Cacheable {
 	private final String packageNames;
 	private final String keyModifier;
 	private String cachedAliEnvOutput;
+	private transient boolean queryOk = false;
 
 	/**
 	 * @param packageNames list of package names
@@ -49,7 +50,10 @@ public class SetAliEnv extends Request implements Cacheable {
 	@Override
 	public void run() {
 		try (DBFunctions db = ConfigUtils.getDB("admin")) {
-			db.query("replace into alienv_cache (packageNames, keyModifier, expires, cachedOutput) values (?, ?, UNIX_TIMESTAMP()+60*60*12, ?);", false, packageNames, keyModifier, cachedAliEnvOutput);
+			db.setQueryTimeout(5);
+			if (db.query("replace into alienv_cache (packageNames, keyModifier, expires, cachedOutput) values (?, ?, UNIX_TIMESTAMP()+60*60*12, ?);", false, packageNames, keyModifier,
+					cachedAliEnvOutput))
+				queryOk = true;
 		}
 
 		monitor.incrementCounter("alienv_cache_set");
@@ -70,6 +74,6 @@ public class SetAliEnv extends Request implements Cacheable {
 
 	@Override
 	public long getTimeout() {
-		return 1000 * 60 * 15;
+		return 1000 * 60 * (queryOk ? 15 : 0);
 	}
 }
-- 
GitLab