/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.redPandaLib.services;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.redPandaLib.Main;
import org.redPandaLib.core.Log;
import org.redPandaLib.core.Peer;
import org.redPandaLib.core.Test;
/**
*
* @author robin
*/
public class LoadHistory {
private static Thread worker = null;
private static boolean run = false;
private static HashMap<Peer, Long> lastRequesteFrom = new HashMap<Peer, Long>();
public static void sw() {
if (worker == null) {
run = true;
worker = new Thread() {
@Override
public void run() {
ThreadMXBean tmb = ManagementFactory.getThreadMXBean();
long time = new Date().getTime() * 1000000;
long cput = 0;
double cpuperc = -1;
while (run && !Main.shutdown) {
if (tmb.isThreadCpuTimeSupported()) {
// if (new Date().getTime() * 1000000 - time > 1000000000) { //Reset once per second
time = new Date().getTime() * 1000000;
//cput = tmb.getCurrentThreadCpuTime();
cput = getTotalCpuTime(tmb);
// }
try {
sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(LoadHistory.class.getName()).log(Level.SEVERE, null, ex);
}
if (!tmb.isThreadCpuTimeEnabled()) {
tmb.setThreadCpuTimeEnabled(true);
}
if (new Date().getTime() * 1000000 - time != 0) {
//cpuperc = (tmb.getCurrentThreadCpuTime() - cput) / (new Date().getTime() * 1000000.0 - time) * 100.0;
cpuperc = (getTotalCpuTime(tmb) - cput) / (new Date().getTime() * 1000000.0 - time) * 100.0;
}
} else {
try {
sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(LoadHistory.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (cpuperc > 200.0) {
System.out.println("too much load... " + cpuperc);
continue;
}
//System.out.println("go back in time...");
System.out.print("b");
for (Peer p : Test.getClonedPeerList()) {
if (p.isAuthed() && p.isConnected() && p.syncMessagesSince == 0) {
long backSyncedTill = p.getPeerTrustData().backSyncedTill;
//System.out.println("peer: " + p.getIp());
if (lastRequesteFrom.get(p) != null && lastRequesteFrom.get(p) == backSyncedTill) {
//System.out.println("last request not done or finished?");
continue;
}
lastRequesteFrom.remove(p);
p.writeBufferLock.lock();
p.writeBuffer.put((byte) 70);
p.writeBuffer.putLong(backSyncedTill);
p.writeBufferLock.unlock();
p.setWriteBufferFilled();
lastRequesteFrom.put(p, backSyncedTill);
Log.put("requested new sync back: " + p.nonce + " time: " + backSyncedTill, 0);
} else {
lastRequesteFrom.remove(p);
}
}
}
}
};
worker.start();
} else {
run = false;
worker.interrupt();
worker = null;
}
}
public static long getTotalCpuTime(ThreadMXBean tmb) {
long[] allThreadIds = tmb.getAllThreadIds();
//System.out.println("Total JVM Thread count: " + allThreadIds.length);
long nano = 0;
for (long id : allThreadIds) {
nano += tmb.getThreadCpuTime(id);
}
return nano;
}
}