///* // * Copyright (c) 2009-2010 by Bjoern Kolbeck, Zuse Institute Berlin // * // * Licensed under the BSD License, see LICENSE file for details. // * // */ // //package org.xtreemfs.foundation.flease.sim; // //import java.net.InetSocketAddress; //import java.util.ArrayList; //import java.util.Iterator; //import java.util.List; //import java.util.Map; //import java.util.concurrent.Semaphore; //import java.util.concurrent.TimeUnit; //import org.xtreemfs.common.TimeSync; //import org.xtreemfs.common.buffer.ASCIIString; //import org.xtreemfs.common.logging.Logging; //import org.xtreemfs.common.logging.Logging.Category; //import org.xtreemfs.foundation.LifeCycleListener; //import org.xtreemfs.foundation.flease.FleaseConfig; //import org.xtreemfs.foundation.flease.FleaseMessageSenderInterface; //import org.xtreemfs.foundation.flease.FleaseStage; //import org.xtreemfs.foundation.flease.FleaseViewChangeListenerInterface; //import org.xtreemfs.foundation.flease.comm.FleaseMessage; //import org.xtreemfs.foundation.flease.proposer.FleaseListener; // ///** // * Simulator for testing // * @author bjko // */ //public class FleaseMultiSim { // // //private void // // /** // * @param args the command line arguments // */ // public static void main(String[] args) { // try { // // final boolean DEBUG_COMM_MSGS = false; // // final int dmax = 500; // final int leaseTimeout = 10000; // // final int numHosts = 10; // final int numConcurrentProposers = 10; // final FleaseStage[] stages = new FleaseStage[numHosts]; // // Logging.start(Logging.LEVEL_DEBUG, Category.all); // TimeSync.initializeLocal(10000, 50); // // final Communicator com = new Communicator(10, 10, 2000, 5, true, 0.05, 0.05, DEBUG_COMM_MSGS); // com.start(); // // List<InetSocketAddress> allPorts = new ArrayList(numHosts); // List<InetSocketAddress>[] acceptors = new List[numHosts]; // // for (int i = 0; i < numHosts; i++) { // final int portNo = 1024+i; // FleaseConfig cfg = new FleaseConfig(leaseTimeout, dmax, 500, new InetSocketAddress(portNo), "localhost:"+(1024+i),5); // stages[i] = new FleaseStage(cfg, "/tmp/xtreemfs-test", new FleaseMessageSenderInterface() { // // public void sendMessage(FleaseMessage message, InetSocketAddress recipient) { // assert(message != null); // if (DEBUG_COMM_MSGS) // Logging.logMessage(Logging.LEVEL_DEBUG, this,"received message for delivery to port %d: %s",recipient.getPort(),message.toString()); // message.setSender(new InetSocketAddress("localhost", portNo)); // com.send(recipient.getPort(), message); // } // }, true, new FleaseViewChangeListenerInterface() { // // public void viewIdChangeEvent(ASCIIString cellId, int viewId) { // //ignore // } // },null); // stages[i].setLifeCycleListener(new LifeCycleListener() { // // public void startupPerformed() { // } // // public void shutdownPerformed() { // } // // public void crashPerformed(Throwable cause) { // cause.printStackTrace(); // System.exit(100); // } // }); // stages[i].start(); // allPorts.add(new InetSocketAddress("localhost", 1024+i)); // com.openPort(1024+i, stages[i]); // } // // for (int i = 0; i < numHosts; i++) { // final int portNo = 1024+i; // acceptors[i] = new ArrayList(numHosts-1); // for (InetSocketAddress ia : allPorts) { // if (ia.getPort() != portNo) // acceptors[i].add(ia); // } // stages[i].openCell(new ASCIIString("testcell"), acceptors[i],true); // } // // //do something // // do { // final List<LInfo> results = new ArrayList(numHosts); // final Semaphore s = new Semaphore(0); // // // final List<Integer> hostNumbers = new ArrayList(numHosts); // for (int i = 0; i < numHosts; i++) // hostNumbers.add(i); // // while (hostNumbers.size()+numConcurrentProposers > numHosts) { // final int tmp = (int)(Math.random()*hostNumbers.size()); // final int host = hostNumbers.remove((int)tmp); // stages[host].getLease(new ASCIIString("testcell"), new FleaseListener() { // // public void proposalResult(ASCIIString cellId, ASCIIString leaseHolder, long leaseTimeout_ms) { // final ASCIIString id = stages[host].getIdentity(); // synchronized (results) { // LInfo i = new LInfo(); // i.host = id; // i.owner = leaseHolder; // i.to = leaseTimeout_ms; // results.add(i); // } // s.release(); // System.out.println("host: "+id+". lease result: "+leaseHolder+"/"+leaseTimeout_ms); // } // // public void proposalFailed(ASCIIString cellId, Throwable cause) { // final ASCIIString id = stages[host].getIdentity(); // System.out.println("host: "+id+". lease failed: "+cause); // s.release(); // } // }); // } // System.out.println("all started"); // // if (!s.tryAcquire(numConcurrentProposers, 30000, TimeUnit.MILLISECONDS)) { // throw new RuntimeException("timed out waiting for semaphore"); // } // // System.out.println("all results available"); // final long now = TimeSync.getGlobalTime(); // // //first: remove all leases which are timed out // Iterator<LInfo> iter = results.iterator(); // while (iter.hasNext()) { // LInfo i = iter.next(); // if (i.to+dmax < now) { // iter.remove(); // } // } // // //now check all the values // ASCIIString owner = null; // LInfo other = null; // boolean violated = false; // for (LInfo i : results) { // if (owner == null) { // owner = i.owner; // other = i; // } else { // if (!owner.equals(i.owner)) { // com.shutdown(); // Map<Thread,StackTraceElement[]> traces = Thread.getAllStackTraces(); // System.out.println("INVARIANT VIOLATED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); // System.out.println("\n\n"); // System.out.println(i.host+" has : "+i.owner+"/"+i.to); // System.out.println(other.host+" has : "+other.owner+"/"+other.to); // // for (int j = 0; j < numHosts; j++) { // System.out.println(stages[j]._dump_acceptor_state(new ASCIIString("testcell"))); // } // // System.out.println(""); // for (Thread t : traces.keySet()) { // System.out.println("Thread: "+t.getName()); // final StackTraceElement[] e = traces.get(t); // for (StackTraceElement elem : e) { // System.out.println(elem.toString()); // } // } // System.exit(2); // } // } // } // // // //make sure that cells also time out some times (requires a wait > 2*lease_timeout) // final int waitTime = (int)(Math.random()*(leaseTimeout*2+2000+dmax)); // System.out.println("waiting for "+waitTime+"ms"); // Thread.sleep(waitTime); // } while (true); // /* // for (int i = 0; i < numHosts; i++) { // stages[i].shutdown(); // } // com.shutdown(); // */ // // } catch (Exception ex) { // ex.printStackTrace(); // Map<Thread,StackTraceElement[]> traces = Thread.getAllStackTraces(); // System.out.println(""); // for (Thread t : traces.keySet()) { // System.out.println("Thread: "+t.getName()); // final StackTraceElement[] e = traces.get(t); // for (StackTraceElement elem : e) { // System.out.println(elem.toString()); // } // } // System.exit(1); // } // // } // // public static final class LInfo { // ASCIIString host; // ASCIIString owner; // long to; // // } // //}