diff options
Diffstat (limited to 'dozentenmodulserver')
7 files changed, 116 insertions, 15 deletions
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/App.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/App.java index 6a7f0e74..179650d5 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/App.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/App.java @@ -15,6 +15,7 @@ import org.openslx.bwlp.sat.database.Database; import org.openslx.bwlp.sat.database.mappers.DbImage; import org.openslx.bwlp.sat.fileserv.FileServer; import org.openslx.bwlp.sat.maintenance.DeleteOldImages; +import org.openslx.bwlp.sat.maintenance.DeleteOldLectures; import org.openslx.bwlp.sat.maintenance.MailFlusher; import org.openslx.bwlp.sat.maintenance.SendExpireWarning; import org.openslx.bwlp.sat.thrift.BinaryListener; @@ -98,6 +99,7 @@ public class App { DeleteOldImages.init(); SendExpireWarning.init(); MailFlusher.init(); + DeleteOldLectures.init(); // Start Thrift Server Thread t; diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java index 8a10fb85..55613554 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java @@ -484,21 +484,26 @@ public class DbImage { public static void markForDeletion(String... imageVersionIds) throws SQLException, TNotFoundException { if (imageVersionIds == null || imageVersionIds.length == 0) return; + List<String> affectedList; try (MysqlConnection connection = Database.getConnection()) { // Disable version in question MysqlStatement disableStmt = connection.prepareStatement("UPDATE imageversion SET" - + " expiretime = UNIX_TIMESTAMP() - 86400, isvalid = 0" - + " WHERE imageversionid = :versionid"); + + " expiretime = 1234567890, isvalid = 0" + " WHERE imageversionid = :versionid"); + affectedList = new ArrayList<>(imageVersionIds.length); for (String imageVersionId : imageVersionIds) { disableStmt.setString("versionid", imageVersionId); - disableStmt.executeUpdate(); + if (disableStmt.executeUpdate() != 0) { + affectedList.add(imageVersionId); + } } connection.commit(); } catch (SQLException e) { LOGGER.error("Query failed in DbImage.markForDeletion()", e); throw e; } - updateLatestVersionAsync(imageVersionIds); + if (!affectedList.isEmpty()) { + updateLatestVersionAsync(affectedList.toArray(new String[affectedList.size()])); + } } public static void setShareMode(String imageBaseId, ImageBaseWrite newData) throws SQLException { @@ -573,27 +578,42 @@ public class DbImage { } } - protected static void markValid(MysqlConnection connection, boolean valid, + /** + * Set validity of given image versions. Returns list of images where the + * validity actually changed. + * + * @param connection + * @param valid + * @param imageVersion + * @return + * @throws SQLException + */ + protected static LocalImageVersion[] markValid(MysqlConnection connection, boolean valid, LocalImageVersion... imageVersion) throws SQLException { if (imageVersion == null || imageVersion.length == 0) - return; + return new LocalImageVersion[0]; MysqlStatement stmt = connection.prepareStatement("UPDATE imageversion SET isvalid = :valid" + " WHERE imageversionid = :imageversionid"); + stmt.setBoolean("valid", valid); + List<LocalImageVersion> retList = new ArrayList<>(imageVersion.length); for (LocalImageVersion version : imageVersion) { stmt.setString("imageversionid", version.imageVersionId); - stmt.setBoolean("valid", valid); - stmt.executeUpdate(); + if (stmt.executeUpdate() != 0) { + retList.add(version); + } } + return retList.toArray(new LocalImageVersion[retList.size()]); } public static void markValid(boolean valid, boolean async, LocalImageVersion... imageVersions) throws SQLException { if (imageVersions == null || imageVersions.length == 0) return; + LocalImageVersion[] affectedVersions; try (MysqlConnection connection = Database.getConnection()) { - markValid(connection, valid, imageVersions); + affectedVersions = markValid(connection, valid, imageVersions); if (!async) { - updateLatestVersion(connection, imageVersions); + updateLatestVersion(connection, affectedVersions); } connection.commit(); } catch (SQLException e) { @@ -601,7 +621,7 @@ public class DbImage { throw e; } if (async) { - updateLatestVersionAsync(imageVersions); + updateLatestVersionAsync(affectedVersions); } } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLecture.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLecture.java index b49d3ae0..74b2cad3 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLecture.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLecture.java @@ -7,6 +7,7 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.UUID; +import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; import org.openslx.bwlp.sat.database.Database; @@ -466,4 +467,16 @@ public class DbLecture { } } + public static void deleteOld(int minAgeDays) throws SQLException { + try (MysqlConnection connection = Database.getConnection()) { + MysqlStatement stmt = connection.prepareStatement("DELETE FROM lecture WHERE enddate < :cutoff"); + stmt.setLong("cutoff", Util.unixTime() - TimeUnit.DAYS.toSeconds(minAgeDays)); + stmt.executeUpdate(); + connection.commit(); + } catch (SQLException e) { + LOGGER.error("Query failed in DbLecture.deleteOld()", e); + throw e; + } + } + } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java index 2a47f5e8..932849b8 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java @@ -116,6 +116,8 @@ public class MailGenerator { newVersion = version; } } + if (oldVersion == newVersion) + return; String message = "Virtuelle Maschine '" + image.imageName + "':"; if (newVersion == null) { message += " Die letzte verbliebene Version der VM wurde gelöscht; VM deaktiviert."; @@ -127,7 +129,7 @@ public class MailGenerator { } catch (TNotFoundException | SQLException e) { uploaderName = "(unbekannt)"; } - message += "\n Neueste Version ist jetzt vom " + Formatter.date(oldVersion.createTime) + message += "\n Neueste Version ist jetzt vom " + Formatter.date(newVersion.createTime) + " (erstellt von " + uploaderName + ")"; if (oldVersion != null) { message += "\n Vorherige Verson war vom " + Formatter.date(oldVersion.createTime); @@ -167,7 +169,7 @@ public class MailGenerator { } } - public static void sendDeletionRemainder(LectureSummary lecture, int days) { + public static void sendEndDateRemainder(LectureSummary lecture, int days) { if (!hasMailConfig()) return; List<UserInfo> relevantUsers = getUserToMail(lecture); diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldLectures.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldLectures.java new file mode 100644 index 00000000..c0a5b65f --- /dev/null +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldLectures.java @@ -0,0 +1,64 @@ +package org.openslx.bwlp.sat.maintenance; + +import java.sql.SQLException; +import java.util.concurrent.TimeUnit; + +import org.apache.log4j.Logger; +import org.joda.time.DateTime; +import org.openslx.bwlp.sat.database.mappers.DbLecture; +import org.openslx.util.QuickTimer; +import org.openslx.util.QuickTimer.Task; + +/** + * Delete old image versions (images that reached their expire time). + */ +public class DeleteOldLectures implements Runnable { + + private static final Logger LOGGER = Logger.getLogger(DeleteOldLectures.class); + + private static final DeleteOldLectures instance = new DeleteOldLectures(); + + private static long blockedUntil = 0; + + /** + * Initialize the delete task. This schedules a timer that runs + * every 5 minutes. If the hour of day reaches 4, it will fire + * the task, and block it from running for the next 12 hours. + */ + public synchronized static void init() { + if (blockedUntil != 0) + return; + blockedUntil = 1; + QuickTimer.scheduleAtFixedRate(new Task() { + @Override + public void fire() { + if (blockedUntil > System.currentTimeMillis()) + return; + DateTime now = DateTime.now(); + if (now.getHourOfDay() != 4 || now.getMinuteOfHour() > 15) + return; + start(); + } + }, TimeUnit.MINUTES.toMillis(6), TimeUnit.MINUTES.toMillis(7)); + } + + public synchronized static void start() { + if (blockedUntil > System.currentTimeMillis()) + return; + if (Maintenance.trySubmit(instance)) { + blockedUntil = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(12); + } + } + + private DeleteOldLectures() { + } + + @Override + public void run() { + try { + DbLecture.deleteOld(365); + } catch (SQLException e) { + } + } + +} diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java index 53f5941e..ba332523 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java @@ -74,7 +74,7 @@ public class SendExpireWarning implements Runnable { final int days = (int) ((lecture.endTime - now) / 86400); LOGGER.debug(lecture.lectureName + " expires in " + days); if ((lecture.isEnabled && (days == 14 || days == 1)) || (days == 7)) { - MailGenerator.sendDeletionRemainder(lecture, days); + MailGenerator.sendEndDateRemainder(lecture, days); } } } diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java index c68e5a8f..be680799 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java @@ -28,7 +28,7 @@ public class WebServer extends NanoHTTPD { }; public WebServer(int port) { - super(port); + super("127.0.0.1", port); } @Override |