(→AHPSCRIPTS-33)
|
(→AHPSCRIPTS-121)
|
Line 2371: | |||
EventService.getInstance().registerEventListener(new LoggingEventListener());</pre> | EventService.getInstance().registerEventListener(new LoggingEventListener());</pre> | ||
+ | = Clean up Massive Job Log Directories = | ||
+ | *A script to find and remove unnecessary (empty) directories in the job log (or other) directory in the anthill server. | ||
+ | ==== AHPSCRIPTS-116 ==== | ||
+ | <pre>/** | ||
+ | * It is advisable that this script only be run by Anthill administrators. | ||
+ | * This script will only remove empty directories left by our cleanup policy. | ||
+ | * Typically directories are not removed because they are likely to be reused | ||
+ | * soon. For some clients, the sheer number of jobs requires these empty | ||
+ | * directories to be managed, despite not being part of the more typical | ||
+ | * cleanup policy. | ||
+ | * | ||
+ | * This script does not remove any files! Only directories. | ||
+ | * | ||
+ | * To prevent conflicts, it is advisable to run this script during a time that | ||
+ | * uses very little activity. | ||
+ | * | ||
+ | * This script uses the AH3ServerJobLogDir property. Ensure this is set when | ||
+ | * running the script. | ||
+ | * | ||
+ | * If the AH3ServerJobLogDir property does not conform to the expected value, | ||
+ | * it will not proceed. This is to prevent the accidental deletion of logs or | ||
+ | * directories. | ||
+ | * | ||
+ | * During testing, the performance of the script is about 2000 directory reads | ||
+ | * per second, and about 1000 directory deletes per second. Milage may vary. | ||
+ | * | ||
+ | * With very little effort, this script could be modified to handle this | ||
+ | * procedure on any accessible directory. Note that the safeguards in place | ||
+ | * should also be updated accordingly. | ||
+ | */ | ||
+ | import com.urbancode.devilfish.services.var.VarService; | ||
+ | import com.urbancode.anthill3.main.DefaultConfiguration; | ||
+ | /** | ||
+ | * function to delete the given directory if and only if | ||
+ | * it consists of empty directories or is empty itself. | ||
+ | */ | ||
+ | int deleteEmptyDirs(File dir) { | ||
+ | int deleteCount = 0; | ||
+ | // we only do this to directories | ||
+ | if (dir.isDirectory()) { | ||
+ | // verify we can list the files here | ||
+ | try { | ||
+ | // first, recurse for all directories in this directory | ||
+ | for (File subdir : dir.listFiles()) { | ||
+ | if(subdir.isDirectory()) { | ||
+ | deleteCount += deleteEmptyDirs(subdir); | ||
+ | } | ||
+ | } | ||
+ | // only delete if we managed to eliminate the subdirectories | ||
+ | if (dir.listFiles().length == 0 && dir.delete()) { | ||
+ | deleteCount++; | ||
+ | } | ||
+ | } | ||
+ | catch (Exception e) { | ||
+ | System.out.println("Permission access error in " + dir.toString() + "."); | ||
+ | } | ||
+ | } | ||
+ | return deleteCount; | ||
+ | } | ||
+ | /** | ||
+ | * Begin actual script. | ||
+ | */ | ||
+ | VarService vs = VarService.getInstance(); | ||
+ | String logDirStr = vs.getVarValue(DefaultConfiguration.LOGS_DIR) + File.separator + "job"; | ||
+ | File logDir = new File(logDirStr); | ||
+ | if(logDir == null) { | ||
+ | throw new IllegalStateException("Log parent directory not found: " + logDir); | ||
+ | } | ||
+ | if(!logDir.isDirectory()) { | ||
+ | throw new IllegalStateException("Log parent directory strangely not a directory: " + logDir); | ||
+ | } | ||
+ | // init metrics | ||
+ | int totalDeletes = 0; | ||
+ | long start = System.currentTimeMillis(); | ||
+ | // perform the delete | ||
+ | for(File dir : logDir.listFiles()) { | ||
+ | totalDeletes += deleteEmptyDirs(dir); | ||
+ | } | ||
+ | // calc metrics | ||
+ | long end = System.currentTimeMillis(); | ||
+ | long secs = (end-start) / 1000; | ||
+ | double deletionRate = ((double)totalDeletes) / ((double)secs); | ||
+ | System.out.println("Deleted " + totalDeletes + " empty directories in " + secs + " seconds (" + deletionRate + " deletes per second).");</pre> |