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
15
16
17 class KernelThread extends Thread {
18 private final static Log log = LogFactory.getLog(KernelThread.class);
19
20 private RepositoryStatisticsImpl repoStats;
21
22
23 private final long PERIOD = 60 * 1000l;
24
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
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
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
68
69
70
71
72
73
74
75
76
77
78
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
105 try {
106 sleep(waitNs / m, (int) (waitNs % m));
107 } catch (InterruptedException e) {
108
109 }
110 cycle++;
111 }
112 }
113
114 synchronized void destroyAndJoin() {
115 running = false;
116 notifyAll();
117
118
119
120
121
122
123
124 }
125 }