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