package net.jxta.impl.cm.bdb; import java.io.File; import java.io.IOException; import net.jxta.document.AdvertisementFactory; import net.jxta.id.IDFactory; import net.jxta.impl.cm.CacheManager; import net.jxta.impl.util.threads.TaskManager; import net.jxta.peergroup.PeerGroupID; import net.jxta.protocol.PeerAdvertisement; public class BDBStressTest { public static void main(String[] args) throws Exception { TaskManager taskManager = new TaskManager(); try { int numRuns = 5; long[] saveTime = new long[numRuns]; long[] removeTime = new long[numRuns]; long[] searchTime = new long[numRuns]; long[] timeResults = new long[numRuns]; for(int i=0; i < numRuns; i++) { File storeRoot = File.createTempFile("bdbstress", null); storeRoot.delete(); storeRoot.mkdir(); System.out.println("Cycle " + i + " start"); long startTime = System.currentTimeMillis(); CacheManager cm = new CacheManager(new BerkeleyDbAdvertisementCache(storeRoot.toURI(), "testArea", taskManager)); PeerGroupID groupId = IDFactory.newPeerGroupID(); performSaves(saveTime, i, cm, groupId); performSearches(searchTime, i, cm); performRemoves(removeTime, i, cm); cm.stop(); timeResults[i] = System.currentTimeMillis() - startTime; deleteDir(storeRoot); System.out.println("Cycle " + i + " complete"); } System.out.println("Average save time for 10000 records: " + calculateAverage(saveTime) + "ms"); System.out.println("Average search time for 1000000 searches: " + calculateAverage(searchTime) + "ms"); System.out.println("Average remove time for 10000 records: " + calculateAverage(removeTime) + "ms"); System.out.println("Average run length: " + calculateAverage(timeResults) + "ms"); } finally { taskManager.shutdown(); } } private static void performSearches(long[] searchTime, int i, CacheManager cm) { long searchStartTime = System.currentTimeMillis(); for(int j=0; j < 1000000; j++) { int index = (int)(Math.random() * 10000); cm.search("" + j, "Name", "MyPeer" + index, 1, null); } searchTime[i] = System.currentTimeMillis() - searchStartTime; } private static void performSaves(long[] saveTime, int i, CacheManager cm, PeerGroupID groupId) throws IOException { long saveStartTime = System.currentTimeMillis(); for(int j=0; j < 10000; j++) { PeerAdvertisement adv = createPeerAdvert(groupId, "MyPeer" + j); cm.save("" + i, "" + j, adv, 100000L, 100000L); } saveTime[i] = System.currentTimeMillis() - saveStartTime; } private static void performRemoves(long[] removeTime, int i, CacheManager cm) throws IOException { long removeStartTime = System.currentTimeMillis(); for(int j=0; j < 10000; j++) { cm.remove("" + i, "" + j); } removeTime[i] = System.currentTimeMillis() - removeStartTime; } private static long calculateAverage(long[] timeResults) { long sum = 0; for(int i=0; i < timeResults.length; i++) { sum += timeResults[i]; } return (sum / timeResults.length); } public static PeerAdvertisement createPeerAdvert(PeerGroupID pgID, String peerName) { PeerAdvertisement peerAdv = (PeerAdvertisement) AdvertisementFactory.newAdvertisement(PeerAdvertisement.getAdvertisementType()); peerAdv.setPeerGroupID(pgID); peerAdv.setPeerID(IDFactory.newPeerID(pgID)); peerAdv.setName(peerName); return peerAdv; } public static void deleteDir(File dir) throws IOException { if (dir.isDirectory()) { String[] children = dir.list(); for (int i=0; i<children.length; i++) { File child = new File(dir, children[i]); deleteDir(child); } } if (!dir.delete()) { throw new IOException("Unable to delete file " + dir.getAbsolutePath()); } } }