package org.geowebcache.storage; import java.io.File; import junit.framework.TestCase; import org.geowebcache.io.ByteArrayResource; import org.geowebcache.io.Resource; import org.geowebcache.storage.blobstore.file.FileBlobStore; public class StorageBrokerTest extends TestCase { public static final String TEST_DB_NAME = "gwcTestStorageBroker"; public static final String TEST_BLOB_DIR_NAME = "gwcTestBlobs"; public static final int THREAD_COUNT = 4; public static final long REPEAT_COUNT = 10; public static final long TILE_GET_COUNT = 20000; public static final long TILE_PUT_COUNT = 30000; public static final boolean RUN_PERFORMANCE_TESTS = false; public void testTileSingleThread() throws Exception { if(! RUN_PERFORMANCE_TESTS) return; StorageBroker sb = resetAndPrepStorageBroker(); for(int i=0;i<REPEAT_COUNT; i++) { runBasicTileTest(sb, i, "Uni"); } } public void testTileMultiThread() throws Exception { if(! RUN_PERFORMANCE_TESTS) return; System.out.println("\n"); StorageBroker sb = resetAndPrepStorageBroker(); long iterations = REPEAT_COUNT; long start = System.currentTimeMillis(); Thread[] threadAr = new Thread[THREAD_COUNT]; for(int i=0; i<THREAD_COUNT; i++) { threadAr[i] = new StorageBrokerTesterThread(sb,"Thread"+i, iterations); } for(int i=0; i<THREAD_COUNT; i++) { threadAr[i].start(); } for(int i=0; i<THREAD_COUNT; i++) { threadAr[i].join(); } long stop = System.currentTimeMillis(); long totalTiles = THREAD_COUNT*iterations*TILE_GET_COUNT; long diff = stop - start; long perSec = totalTiles*1000/diff; long bw = (20*1024*8*perSec)/1000000; System.out.println("Total time: " + diff + "ms for " + totalTiles + " tiles (" + perSec + " tiles/second, " + bw + " mbps with 20kbyte tiles) " + " fetched by " + THREAD_COUNT + " threads in parallel" ); } private StorageBroker resetAndPrepStorageBroker() throws Exception { System.out.println("Deleting old test database."); String blobPath = findTempDir() + File.separator + TEST_BLOB_DIR_NAME; System.out.println("Creating new blobstore in " + blobPath); File blobDirs = new File(blobPath); if(! blobDirs.exists() && ! blobDirs.mkdirs()) { throw new StorageException("Unable to create " + blobPath); } BlobStore blobStore = new FileBlobStore(blobPath); TransientCache transCache = new TransientCache(100, 1024, 2000); StorageBroker sb = new DefaultStorageBroker(blobStore); //long[] xyz = {1L,2L,3L}; Resource blob = new ByteArrayResource(new byte[20*1024]); System.out.println("Inserting into database, " + TILE_PUT_COUNT + " tiles"); long startInsert = System.currentTimeMillis(); for(int i=1; i < TILE_PUT_COUNT; i++) { long tmp = (long) Math.log(i) + 1; long tmp2 = i % tmp; long[] xyz = { tmp2, tmp2, (long) Math.log10(i)}; TileObject completeObj = TileObject.createCompleteTileObject("test", xyz,"hefty-gridSet:id1", "image/jpeg", null, blob); sb.put(completeObj); } long stopInsert = System.currentTimeMillis(); System.out.println(TILE_PUT_COUNT+ " inserts took " + Long.toString(stopInsert - startInsert) + "ms"); return sb; } public static String findTempDir() throws Exception { String tmpDir = System.getProperty("java.io.tmpdir"); if(tmpDir == null || ! (new File(tmpDir)).canWrite()) { throw new Exception("Temporary directory " + tmpDir + " does not exist or is not writable."); } return tmpDir; } private void runBasicTileTest(StorageBroker sb, long run, String name) throws StorageException { long start = System.currentTimeMillis(); for(int i=1; i<TILE_GET_COUNT; i++) { long tmp = (long) Math.log(i) + 1; long tmp2 = i % tmp; long[] xyz = { tmp2, tmp2, (long) Math.log10(i)}; TileObject queryObj2 = TileObject.createQueryTileObject("test", xyz,"hefty-gridSet:id1", "image/jpeg", null); sb.get(queryObj2); } long stop = System.currentTimeMillis(); System.out.println(name + " - run "+run+", " +TILE_GET_COUNT+" gets took " + Long.toString(stop - start) + "ms"); } public class StorageBrokerTesterThread extends Thread { StorageBroker sb = null; String fail = null; String name = null; long iterations; public StorageBrokerTesterThread(StorageBroker sb, String name, long iterations) { this.sb = sb; this.name = name; this.iterations = iterations; } public void run() { try { for(long i=0;i<iterations; i++) { runBasicTileTest(sb, i, name); } } catch (Exception e) { fail = e.getMessage(); } } } }