|
(Alphabetization Complete!)
|
(Meh...missed one; so it is getting added as a black sheep ~~~~)
|
| Line 2599: | |||
| } | } | ||
| </pre> | </pre> | ||
| + | = Script to Cleanup Job & Workflow Logs from AHP Server = | ||
| + | * You can have an operations project that runs an evaluate script step with the following contents. This is safe to run any time but should only be needed for 3.5/3.6 instances that did not do the cleanup during the upgrade: | ||
| + | ==== AHPSCRIPTS-92 ==== | ||
| + | <pre>import com.urbancode.anthill3.services.logging.LogNamingHelper; | ||
| + | import com.urbancode.anthill3.spring.SpringSupport; | ||
| + | import com.urbancode.commons.fileutils.FileUtils; | ||
| + | import org.springframework.jdbc.core.JdbcTemplate; | ||
| + | import javax.sql.DataSource; | ||
| + | import java.io.File; | ||
| + | import java.io.FileFilter; | ||
| + | import java.io.PrintStream; | ||
| + | import java.util.HashSet; | ||
| + | import java.util.List; | ||
| + | import java.util.Set; | ||
| + | int jobCount = 0; | ||
| + | int wcCount = 0; | ||
| + | void cleanupDirectory(File dir, String baseDirPath, Set idSet, long highestJobId) { | ||
| + | if (dir.isDirectory()) { | ||
| + | File[] fileArray = dir.listFiles(new FileFilter() { | ||
| + | public boolean accept(File pathname) { | ||
| + | return pathname.isDirectory(); | ||
| + | } | ||
| + | }); | ||
| + | for (File file : fileArray) { | ||
| + | cleanupDirectory(file, baseDirPath, idSet, highestJobId); | ||
| + | } | ||
| + | commandOutput.println("\t\tCleaning up: " + dir.getAbsolutePath()); | ||
| + | String[] tokens = dir.getAbsolutePath().substring(baseDirPath.length()).split(File.separator); | ||
| + | StringBuffer buffer = new StringBuffer(); | ||
| + | for (int i = tokens.length - 1; i > -1; i--) { | ||
| + | buffer.append(tokens[i]); | ||
| + | } | ||
| + | long jobId = Long.parseLong(buffer.toString()); | ||
| + | if (!idSet.contains(jobId) && jobId < highestJobId) { | ||
| + | File[] fileList = dir.listFiles(new FileFilter(){public boolean accept(File pathname) {return !pathname.isDirectory();}}); | ||
| + | if (fileList.length > 0) { | ||
| + | commandOutput.println("Found orphaned dir: " + dir.getAbsolutePath()); | ||
| + | jobCount++; | ||
| + | for (File file : fileList) { | ||
| + | file.delete(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | if (dir.list().length == 0) { | ||
| + | dir.delete(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | void cleanupWcDirectory(File dir, String baseDirPath, Set idSet, long highestWcId) { | ||
| + | if (dir.isDirectory()) { | ||
| + | File[] fileArray = dir.listFiles(new FileFilter() { | ||
| + | public boolean accept(File pathname) { | ||
| + | return pathname.isDirectory(); | ||
| + | } | ||
| + | }); | ||
| + | commandOutput.println("\t\tCleaning up: " + dir.getAbsolutePath()); | ||
| + | for (File file : fileArray) { | ||
| + | if (Character.isDigit(file.getName().charAt(0))) { | ||
| + | cleanupWcDirectory(file, baseDirPath, idSet, highestWcId); | ||
| + | } | ||
| + | } | ||
| + | String[] tokens = dir.getAbsolutePath().substring(baseDirPath.length()).split(File.separator); | ||
| + | StringBuffer buffer = new StringBuffer(); | ||
| + | for (int i = tokens.length - 1; i > -1; i--) { | ||
| + | buffer.append(tokens[i]); | ||
| + | } | ||
| + | long wcId = Long.parseLong(buffer.toString()); | ||
| + | if (!idSet.contains(wcId) && wcId < highestWcId) { File[] fileList = dir.listFiles(new FileFilter(){ | ||
| + | public boolean accept(File pathname) { | ||
| + | return !pathname.isDirectory() || pathname.getName().equals("wf"); | ||
| + | } | ||
| + | }); | ||
| + | if (fileList.length > 0) { | ||
| + | commandOutput.println("Found orphaned dir: " + dir.getAbsolutePath()); | ||
| + | wcCount++; | ||
| + | for (File file : fileList) { | ||
| + | FileUtils.deleteFile(file); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | if (dir.list().length == 0) { | ||
| + | dir.delete(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | try { | ||
| + | DataSource ds = (DataSource)SpringSupport.getInstance().getBean("dataSource"); | ||
| + | JdbcTemplate jdbcTemplate = new JdbcTemplate(ds); | ||
| + | String logsDirString = LogNamingHelper.getInstance().getLogDirPath() + File.separator + "job"; | ||
| + | commandOutput.println("Log files located at: " + logsDirString); | ||
| + | long highestJobId = jdbcTemplate.queryForLong("SELECT HI_VAL FROM HI_LO_SEQ WHERE SEQ_NAME = 'JOB_TRACE'"); | ||
| + | List idList = jdbcTemplate.queryForList("SELECT ID FROM JOB_TRACE", Long.class); | ||
| + | Set idSet = new HashSet(); | ||
| + | idSet.addAll(idList); | ||
| + | commandOutput.println("Found " + idSet.size() + " known jobs - highest job id " + highestJobId); | ||
| + | commandOutput.println("Deleting orphaned job log and output files."); | ||
| + | commandOutput.println(" This may take a while, please be patient..."); | ||
| + | File baseDir = new File(logsDirString); | ||
| + | File[] fileArray = baseDir.listFiles(new FileFilter() { | ||
| + | public boolean accept(File pathname) { | ||
| + | return pathname.isDirectory(); | ||
| + | } | ||
| + | }); | ||
| + | for (File file : fileArray) { | ||
| + | cleanupDirectory(file, logsDirString, idSet, highestJobId); | ||
| + | } | ||
| + | String wcDirString = LogNamingHelper.getInstance().getLogDirPath() + File.separator + "wf"; | ||
| + | commandOutput.println("Log files located at: " + logsDirString); | ||
| + | long highestWcId = jdbcTemplate.queryForLong("SELECT HI_VAL FROM HI_LO_SEQ WHERE SEQ_NAME = 'WORKFLOW_CASE'"); | ||
| + | idList = jdbcTemplate.queryForList("SELECT ID FROM WORKFLOW_CASE", Long.class); | ||
| + | idSet.clear(); | ||
| + | idSet.addAll(idList); | ||
| + | commandOutput.println("---------------------------------------------------------"); | ||
| + | commandOutput.println("Found " + idSet.size() + " known workflow cases - highest workflow case id " + highestWcId); | ||
| + | commandOutput.println("Deleting orphaned workflow case log and output files."); | ||
| + | commandOutput.println(" This may take a while, please be patient..."); | ||
| + | baseDir = new File(wcDirString); | ||
| + | fileArray = baseDir.listFiles(new FileFilter() { | ||
| + | public boolean accept(File pathname) { | ||
| + | return pathname.isDirectory(); | ||
| + | } | ||
| + | }); | ||
| + | for (File file : fileArray) { | ||
| + | cleanupWcDirectory(file, wcDirString, idSet, highestWcId); | ||
| + | } | ||
| + | commandOutput.println("Cleanup Complete!"); | ||
| + | commandOutput.println("Removed " + jobCount + " job and " + wcCount + " workflow case orphaned directories!"); | ||
| + | } | ||
| + | catch (Exception e) { | ||
| + | e.printStackTrace(commandOutput); | ||
| + | }</pre> | ||