]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelThread.java
Clarify naming.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / KernelThread.java
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 }