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
.CmsException
;
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 RepositoryStatisticsImpl repoStats
;
20 /** The smallest period of operation, in ms */
21 private final long PERIOD
= 60 * 1000l;
23 private final static long m
= 1000l * 1000l;
24 private final static long M
= 1024l * 1024l;
26 private boolean running
= true;
28 private Log kernelStatsLog
= LogFactory
.getLog("argeo.stats.kernel");
29 private Log nodeStatsLog
= LogFactory
.getLog("argeo.stats.node");
31 @SuppressWarnings("unused")
32 private long cycle
= 0l;
34 public KernelThread(ThreadGroup threadGroup
, String name
) {
35 super(threadGroup
, name
);
38 private void doSmallestPeriod() {
39 // Clean expired sessions
40 CmsSessionImpl
.closeInvalidSessions();
42 if (kernelStatsLog
.isDebugEnabled()) {
43 StringBuilder line
= new StringBuilder(64);
45 long freeMem
= Runtime
.getRuntime().freeMemory() / M
;
46 long totalMem
= Runtime
.getRuntime().totalMemory() / M
;
47 long maxMem
= Runtime
.getRuntime().maxMemory() / M
;
48 double loadAvg
= ManagementFactory
.getOperatingSystemMXBean().getSystemLoadAverage();
51 long uptime
= ManagementFactory
.getRuntimeMXBean().getUptime() / (1000 * 60);
52 if (uptime
> 24 * 60) {
56 line
.append(uptime
).append(min ?
" min" : " h").append('\t');
57 line
.append(loadAvg
).append('\t').append(maxMem
).append('\t').append(totalMem
).append('\t').append(freeMem
)
59 kernelStatsLog
.debug(line
);
62 if (nodeStatsLog
.isDebugEnabled()) {
63 File dataDir
= KernelUtils
.getOsgiInstanceDir();
64 long freeSpace
= dataDir
.getUsableSpace() / M
;
65 // File currentRoot = null;
66 // for (File root : File.listRoots()) {
67 // String rootPath = root.getAbsolutePath();
68 // if (dataDir.getAbsolutePath().startsWith(rootPath)) {
69 // if (currentRoot == null
70 // || (rootPath.length() > currentRoot.getPath()
72 // currentRoot = root;
76 // long totalSpace = currentRoot.getTotalSpace();
77 StringBuilder line
= new StringBuilder(128);
78 line
.append("§\t").append(freeSpace
).append(" MB left in " + dataDir
);
80 if (repoStats
!= null)
81 for (RepositoryStatistics
.Type type
: RepositoryStatistics
.Type
.values()) {
82 long[] vals
= repoStats
.getTimeSeries(type
).getValuePerMinute();
83 long val
= vals
[vals
.length
- 1];
84 line
.append(type
.name()).append('\t').append(val
).append('\n');
86 nodeStatsLog
.debug(line
);
92 final long periodNs
= PERIOD
* m
;
94 long beginNs
= System
.nanoTime();
97 long waitNs
= periodNs
- (System
.nanoTime() - beginNs
);
102 sleep(waitNs
/ m
, (int) (waitNs
% m
));
103 } catch (InterruptedException e
) {
110 synchronized void destroyAndJoin() {
116 } catch (InterruptedException e
) {
117 throw new CmsException("Kernel thread destruction was interrupted");