1 package org
.argeo
.cms
.internal
.kernel
;
4 import java
.lang
.management
.ManagementFactory
;
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
.internal
.auth
.CmsSessionImpl
;
13 * Background thread started by the kernel, which gather statistics and
14 * monitor/control other processes.
16 class KernelThread
extends Thread
{
17 private final static Log log
= LogFactory
.getLog(KernelThread
.class);
19 private RepositoryStatisticsImpl repoStats
;
21 /** The smallest period of operation, in ms */
22 private final long PERIOD
= 60 * 1000l;
24 private final static long m
= 1000l * 1000l;
25 private final static long M
= 1024l * 1024l;
27 private boolean running
= true;
29 private Log kernelStatsLog
= LogFactory
.getLog("argeo.stats.kernel");
30 private Log nodeStatsLog
= LogFactory
.getLog("argeo.stats.node");
32 @SuppressWarnings("unused")
33 private long cycle
= 0l;
35 public KernelThread(ThreadGroup threadGroup
, String name
) {
36 super(threadGroup
, name
);
39 private void doSmallestPeriod() {
40 // Clean expired sessions
41 CmsSessionImpl
.closeInvalidSessions();
43 if (kernelStatsLog
.isDebugEnabled()) {
44 StringBuilder line
= new StringBuilder(64);
46 long freeMem
= Runtime
.getRuntime().freeMemory() / M
;
47 long totalMem
= Runtime
.getRuntime().totalMemory() / M
;
48 long maxMem
= Runtime
.getRuntime().maxMemory() / M
;
49 double loadAvg
= ManagementFactory
.getOperatingSystemMXBean().getSystemLoadAverage();
52 long uptime
= ManagementFactory
.getRuntimeMXBean().getUptime() / (1000 * 60);
53 if (uptime
> 24 * 60) {
57 line
.append(uptime
).append(min ?
" min" : " h").append('\t');
58 line
.append(loadAvg
).append('\t').append(maxMem
).append('\t').append(totalMem
).append('\t').append(freeMem
)
60 kernelStatsLog
.debug(line
);
63 if (nodeStatsLog
.isDebugEnabled()) {
64 File dataDir
= KernelUtils
.getOsgiInstanceDir();
65 long freeSpace
= dataDir
.getUsableSpace() / M
;
66 // File currentRoot = null;
67 // for (File root : File.listRoots()) {
68 // String rootPath = root.getAbsolutePath();
69 // if (dataDir.getAbsolutePath().startsWith(rootPath)) {
70 // if (currentRoot == null
71 // || (rootPath.length() > currentRoot.getPath()
73 // currentRoot = root;
77 // long totalSpace = currentRoot.getTotalSpace();
78 StringBuilder line
= new StringBuilder(128);
79 line
.append("§\t").append(freeSpace
).append(" MB left in " + dataDir
);
81 if (repoStats
!= null)
82 for (RepositoryStatistics
.Type type
: RepositoryStatistics
.Type
.values()) {
83 long[] vals
= repoStats
.getTimeSeries(type
).getValuePerMinute();
84 long val
= vals
[vals
.length
- 1];
85 line
.append(type
.name()).append('\t').append(val
).append('\n');
87 nodeStatsLog
.debug(line
);
93 if (log
.isTraceEnabled())
94 log
.trace("Kernel thread started.");
95 final long periodNs
= PERIOD
* m
;
97 long beginNs
= System
.nanoTime();
100 long waitNs
= periodNs
- (System
.nanoTime() - beginNs
);
105 sleep(waitNs
/ m
, (int) (waitNs
% m
));
106 } catch (InterruptedException e
) {
113 synchronized void destroyAndJoin() {
119 // } catch (InterruptedException e) {
120 // // throw new CmsException("Kernel thread destruction was interrupted");
121 // log.error("Kernel thread destruction was interrupted", e);