From 8c4e823cfb743c60d5c328d76981761187c96828 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Thu, 7 May 2026 17:57:47 -0700 Subject: [PATCH 1/2] Improve cache clearing/GC/heap dump behavior --- .../remoteapi/admin/ClearCachesCommand.java | 31 +++++++++++++++++++ src/org/labkey/test/BaseWebDriverTest.java | 27 +++++++++++----- .../tests/filecontent/FilesQueryTest.java | 2 +- .../tests/perf/SchemaBrowserPerfTest.java | 6 ++-- 4 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 src/org/labkey/remoteapi/admin/ClearCachesCommand.java diff --git a/src/org/labkey/remoteapi/admin/ClearCachesCommand.java b/src/org/labkey/remoteapi/admin/ClearCachesCommand.java new file mode 100644 index 0000000000..cf7d6e82ed --- /dev/null +++ b/src/org/labkey/remoteapi/admin/ClearCachesCommand.java @@ -0,0 +1,31 @@ +package org.labkey.remoteapi.admin; + +import org.labkey.remoteapi.CommandResponse; +import org.labkey.remoteapi.PostCommand; + +import java.util.HashMap; +import java.util.Map; + +public class ClearCachesCommand extends PostCommand +{ + private final boolean _clearCaches; + private final boolean _gc; + + public ClearCachesCommand(boolean clearCaches, boolean gc) + { + super("admin", "clearCaches"); + _clearCaches = clearCaches; + _gc = gc; + } + + @Override + protected Map createParameterMap() + { + Map params = new HashMap<>(); + if (_clearCaches) + params.put("clearCaches", "1"); + if (_gc) + params.put("gc", "1"); + return params; + } +} diff --git a/src/org/labkey/test/BaseWebDriverTest.java b/src/org/labkey/test/BaseWebDriverTest.java index 10d9d5ad98..c92ce90784 100644 --- a/src/org/labkey/test/BaseWebDriverTest.java +++ b/src/org/labkey/test/BaseWebDriverTest.java @@ -44,6 +44,7 @@ import org.labkey.remoteapi.CommandException; import org.labkey.remoteapi.CommandResponse; import org.labkey.remoteapi.Connection; +import org.labkey.remoteapi.admin.ClearCachesCommand; import org.labkey.remoteapi.SimpleGetCommand; import org.labkey.remoteapi.SimplePostCommand; import org.labkey.remoteapi.collections.CaseInsensitiveHashMap; @@ -99,7 +100,6 @@ import org.labkey.test.util.UIPermissionsHelper; import org.labkey.test.util.core.webdav.WebDavUploadHelper; import org.labkey.test.util.ext4cmp.Ext4FieldRef; -import org.labkey.test.util.query.QueryUtils; import org.labkey.test.util.selenium.WebDriverUtils; import org.openqa.selenium.By; import org.openqa.selenium.ElementClickInterceptedException; @@ -1389,6 +1389,22 @@ public static File getDownloadDir() return SingletonWebDriver.getInstance().getDownloadDir(); } + /** + * Clears all server caches and runs garbage collection via the admin ClearCachesAction. + * Leaves the browser on the MemTracker page. + */ + protected void clearCaches() + { + try + { + new ClearCachesCommand(true, true).execute(createDefaultConnection(), "/"); + } + catch (IOException | CommandException e) + { + throw new RuntimeException("Failed to clear caches", e); + } + } + protected void checkLeaks() { if (isLeakCheckSkipped()) @@ -1415,7 +1431,8 @@ protected void checkLeaks() } } msSinceTestStart = System.currentTimeMillis() - previousLeakCheck; - beginAt(WebTestHelper.buildURL("admin", "memTracker", Map.of("gc", 1, "clearCaches", 1)), 120000); + clearCaches(); + beginAt(WebTestHelper.buildURL("admin", "memTracker")); if (!isTextPresent("In-Use Objects")) throw new IllegalStateException("Asserts must be enabled to track memory leaks; add -ea to your server VM params and restart or add -DmemCheck=false to your test VM params."); leakCount = getImageWithAltTextCount("expand/collapse"); @@ -2379,12 +2396,6 @@ public void validateQueries(boolean validateSubfolders) validateQueries(validateSubfolders, 120000); } - @Deprecated - public void deleteAllRows(String projectName, String schema, String table) throws IOException, CommandException - { - QueryUtils.truncateTable(projectName, schema, table); - } - // This class makes it easier to start a specimen import early in a test and wait for completion later. public class SpecimenImporter { diff --git a/src/org/labkey/test/tests/filecontent/FilesQueryTest.java b/src/org/labkey/test/tests/filecontent/FilesQueryTest.java index dbcd52fbf0..2fafacdeca 100644 --- a/src/org/labkey/test/tests/filecontent/FilesQueryTest.java +++ b/src/org/labkey/test/tests/filecontent/FilesQueryTest.java @@ -173,7 +173,7 @@ public void testNonFileBrowserFileRecords() private void ensureFilesUpToDate() { log("Clear cache so that exp.files will do a sync immediately"); - beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", "1")), 120000); + clearCaches(); goToProjectHome(); } diff --git a/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java b/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java index af48928236..05a938bcfa 100644 --- a/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java +++ b/src/org/labkey/test/tests/perf/SchemaBrowserPerfTest.java @@ -88,7 +88,7 @@ private long[] studyBaselineEmptyCache() { long[] emptyCacheOpenStudyTimes = new long[5]; // run tests for (int x = 0 ; x < 5; x++) { - beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", 1)), 120000); + clearCaches(); goToHome(); clickProject(getProjectName()); goToSchemaBrowser(); @@ -103,7 +103,7 @@ private long[] studyBaselineEmptyCache() { private long[] studyBaselineFullCache() { long[] fullCacheOpenStudyTimes = new long[5]; // prepare cache - beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", 1)), 120000); + clearCaches(); goToHome(); clickProject(getProjectName()); goToSchemaBrowser(); @@ -125,7 +125,7 @@ private long[] studyBaselineFullCache() { private long[] studyDataBaselineFullCache() { long[] emptyCacheOpenStudyDataTimes = new long[5]; // prepare cache - beginAt(WebTestHelper.buildURL("admin", "caches", Map.of("clearCaches", 1)), 120000); + clearCaches(); goToHome(); clickProject(getProjectName()); goToSchemaBrowser(); From cc3ceade85a9ac733c84e570f7b0461a740f01af Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Fri, 8 May 2026 15:59:43 -0700 Subject: [PATCH 2/2] Update heap dumping --- src/org/labkey/test/BaseWebDriverTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/org/labkey/test/BaseWebDriverTest.java b/src/org/labkey/test/BaseWebDriverTest.java index c92ce90784..039872a8db 100644 --- a/src/org/labkey/test/BaseWebDriverTest.java +++ b/src/org/labkey/test/BaseWebDriverTest.java @@ -1174,6 +1174,7 @@ public void dumpHeap() // Use dumpHeapAction rather that touching file so that we can get file name and publish artifact. beginAt(WebTestHelper.buildURL("admin", "dumpHeap")); + clickButton("OK"); String dumpMsg = Locators.bodyPanel().childTag("div").findElement(getDriver()).getText(); String filePrefix = "Heap dumped to "; int prefixIndex = dumpMsg.indexOf(filePrefix);