1 package org
.argeo
.cms
.internal
.kernel
;
3 import java
.awt
.image
.Kernel
;
5 import java
.lang
.management
.ManagementFactory
;
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
;
14 * Background thread started by the {@link Kernel}, which gather statistics and
15 * monitor/control other processes.
17 class KernelThread
extends Thread
{
18 private final static Log log
= LogFactory
.getLog(KernelThread
.class);
20 private RepositoryStatisticsImpl repoStats
;
22 /** The smallest period of operation, in ms */
23 private final long PERIOD
= 60 * 1000l;
25 private final static long m
= 1000l * 1000l;
26 private final static long M
= 1024l * 1024l;
28 private boolean running
= true;
30 private Log kernelStatsLog
= LogFactory
.getLog("argeo.stats.kernel");
31 private Log nodeStatsLog
= LogFactory
.getLog("argeo.stats.node");
33 @SuppressWarnings("unused")
34 private long cycle
= 0l;
36 public KernelThread(ThreadGroup threadGroup
, String name
) {
37 super(threadGroup
, name
);
40 private void doSmallestPeriod() {
41 // Clean expired sessions
42 CmsSessionImpl
.closeInvalidSessions();
44 if (kernelStatsLog
.isDebugEnabled()) {
45 StringBuilder line
= new StringBuilder(64);
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();
53 long uptime
= ManagementFactory
.getRuntimeMXBean().getUptime() / (1000 * 60);
54 if (uptime
> 24 * 60) {
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
)
61 kernelStatsLog
.debug(line
);
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()
74 // currentRoot = root;
78 // long totalSpace = currentRoot.getTotalSpace();
79 StringBuilder line
= new StringBuilder(128);
80 line
.append("§\t").append(freeSpace
).append(" MB left in " + dataDir
);
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');
88 nodeStatsLog
.debug(line
);
94 if (log
.isTraceEnabled())
95 log
.trace("Kernel thread started.");
96 final long periodNs
= PERIOD
* m
;
98 long beginNs
= System
.nanoTime();
101 long waitNs
= periodNs
- (System
.nanoTime() - beginNs
);
106 sleep(waitNs
/ m
, (int) (waitNs
% m
));
107 } catch (InterruptedException e
) {
114 synchronized void destroyAndJoin() {
120 // } catch (InterruptedException e) {
121 // // throw new CmsException("Kernel thread destruction was interrupted");
122 // log.error("Kernel thread destruction was interrupted", e);