View Javadoc
1   package org.argeo.cms.internal.kernel;
2   
3   import java.awt.image.Kernel;
4   import java.io.File;
5   import java.lang.management.ManagementFactory;
6   
7   import org.apache.commons.logging.Log;
8   import org.apache.commons.logging.LogFactory;
9   import org.apache.jackrabbit.api.stats.RepositoryStatistics;
10  import org.apache.jackrabbit.stats.RepositoryStatisticsImpl;
11  import org.argeo.cms.internal.auth.CmsSessionImpl;
12  
13  /**
14   * Background thread started by the {@link Kernel}, which gather statistics and
15   * monitor/control other processes.
16   */
17  class KernelThread extends Thread {
18  	private final static Log log = LogFactory.getLog(KernelThread.class);
19  
20  	private RepositoryStatisticsImpl repoStats;
21  
22  	/** The smallest period of operation, in ms */
23  	private final long PERIOD = 60 * 1000l;
24  	/** One ms in ns */
25  	private final static long m = 1000l * 1000l;
26  	private final static long M = 1024l * 1024l;
27  
28  	private boolean running = true;
29  
30  	private Log kernelStatsLog = LogFactory.getLog("argeo.stats.kernel");
31  	private Log nodeStatsLog = LogFactory.getLog("argeo.stats.node");
32  
33  	@SuppressWarnings("unused")
34  	private long cycle = 0l;
35  
36  	public KernelThread(ThreadGroup threadGroup, String name) {
37  		super(threadGroup, name);
38  	}
39  
40  	private void doSmallestPeriod() {
41  		// Clean expired sessions
42  		CmsSessionImpl.closeInvalidSessions();
43  
44  		if (kernelStatsLog.isDebugEnabled()) {
45  			StringBuilder line = new StringBuilder(64);
46  			line.append("§\t");
47  			long freeMem = Runtime.getRuntime().freeMemory() / M;
48  			long totalMem = Runtime.getRuntime().totalMemory() / M;
49  			long maxMem = Runtime.getRuntime().maxMemory() / M;
50  			double loadAvg = ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage();
51  			// in min
52  			boolean min = true;
53  			long uptime = ManagementFactory.getRuntimeMXBean().getUptime() / (1000 * 60);
54  			if (uptime > 24 * 60) {
55  				min = false;
56  				uptime = uptime / 60;
57  			}
58  			line.append(uptime).append(min ? " min" : " h").append('\t');
59  			line.append(loadAvg).append('\t').append(maxMem).append('\t').append(totalMem).append('\t').append(freeMem)
60  					.append('\t');
61  			kernelStatsLog.debug(line);
62  		}
63  
64  		if (nodeStatsLog.isDebugEnabled()) {
65  			File dataDir = KernelUtils.getOsgiInstanceDir();
66  			long freeSpace = dataDir.getUsableSpace() / M;
67  			// File currentRoot = null;
68  			// for (File root : File.listRoots()) {
69  			// String rootPath = root.getAbsolutePath();
70  			// if (dataDir.getAbsolutePath().startsWith(rootPath)) {
71  			// if (currentRoot == null
72  			// || (rootPath.length() > currentRoot.getPath()
73  			// .length())) {
74  			// currentRoot = root;
75  			// }
76  			// }
77  			// }
78  			// long totalSpace = currentRoot.getTotalSpace();
79  			StringBuilder line = new StringBuilder(128);
80  			line.append("§\t").append(freeSpace).append(" MB left in " + dataDir);
81  			line.append('\n');
82  			if (repoStats != null)
83  				for (RepositoryStatistics.Type type : RepositoryStatistics.Type.values()) {
84  					long[] vals = repoStats.getTimeSeries(type).getValuePerMinute();
85  					long val = vals[vals.length - 1];
86  					line.append(type.name()).append('\t').append(val).append('\n');
87  				}
88  			nodeStatsLog.debug(line);
89  		}
90  	}
91  
92  	@Override
93  	public void run() {
94  		if (log.isTraceEnabled())
95  			log.trace("Kernel thread started.");
96  		final long periodNs = PERIOD * m;
97  		while (running) {
98  			long beginNs = System.nanoTime();
99  			doSmallestPeriod();
100 
101 			long waitNs = periodNs - (System.nanoTime() - beginNs);
102 			if (waitNs < 0)
103 				continue;
104 			// wait
105 			try {
106 				sleep(waitNs / m, (int) (waitNs % m));
107 			} catch (InterruptedException e) {
108 				// silent
109 			}
110 			cycle++;
111 		}
112 	}
113 
114 	synchronized void destroyAndJoin() {
115 		running = false;
116 		notifyAll();
117 //		interrupt();
118 //		try {
119 //			join(PERIOD * 2);
120 //		} catch (InterruptedException e) {
121 //			// throw new CmsException("Kernel thread destruction was interrupted");
122 //			log.error("Kernel thread destruction was interrupted", e);
123 //		}
124 	}
125 }