/* * Created on 04-Aug-2004 * Created by Paul Gardner * Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * AELITIS, SAS au capital de 46,603.30 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package com.aelitis.azureus.core.diskmanager.cache.impl; import java.io.*; import org.gudy.azureus2.core3.torrent.TOTorrentFile; import org.gudy.azureus2.core3.util.*; import org.gudy.azureus2.core3.logging.*; import com.aelitis.azureus.core.diskmanager.cache.*; /** * @author parg * */ public class Test { public static void main( String []args ) { System.setProperty("azureus.log.stdout","1"); Logger.addListener(new ILogEventListener() { public void log(LogEvent event) { System.out.println(event.text); } }); try{ CacheFileManagerImpl manager = (CacheFileManagerImpl)CacheFileManagerFactory.getSingleton(); //manager.initialise( false, 8*1024*1024 ); //new Test().writeTest(manager); manager.initialise( true, true, true, 10*1024*1024, 1024 ); new Test().writeTest(manager); }catch( Throwable e ){ Debug.printStackTrace( e ); } } public void writeTest( CacheFileManagerImpl manager ) { try{ final File f = new File("C:\\temp\\cachetest.dat" ); f.delete(); CacheFile cf = manager.createFile( new CacheFileOwner() { public String getCacheFileOwnerName() { return( "file " + f.toString() ); } public TOTorrentFile getCacheFileTorrentFile() { return( null ); } public File getCacheFileControlFile(String name) { return null; } public int getCacheMode() { return( CacheFileOwner.CACHE_MODE_NORMAL ); } }, f, CacheFile.CT_LINEAR ); cf.setAccessMode( CacheFile.CF_WRITE ); long start = System.currentTimeMillis(); int loop = 10000; int block = 1*1024; for (int i=0;i<loop;i++){ DirectByteBuffer buffer = DirectByteBufferPool.getBuffer( DirectByteBuffer.AL_OTHER, block); cf.writeAndHandoverBuffer( buffer, i*block); } cf.close(); long now = System.currentTimeMillis(); long total = loop*block; long elapsed = now - start; System.out.println( "time = " + elapsed + ", speed = " + (total/elapsed)); }catch( Throwable e ){ Debug.printStackTrace( e ); } } public void manualTest( CacheFileManager manager ) { try{ final File f = new File("C:\\temp\\cachetest.dat" ); f.delete(); CacheFile cf = manager.createFile( new CacheFileOwner() { public String getCacheFileOwnerName() { return( "file " + f.toString() ); } public TOTorrentFile getCacheFileTorrentFile() { return( null ); } public File getCacheFileControlFile(String name) { return null; } public int getCacheMode() { return( CacheFileOwner.CACHE_MODE_NORMAL ); } }, f, CacheFile.CT_LINEAR ); DirectByteBuffer write_buffer1 = DirectByteBufferPool.getBuffer(DirectByteBuffer.AL_OTHER,512); DirectByteBuffer write_buffer2 = DirectByteBufferPool.getBuffer(DirectByteBuffer.AL_OTHER,512); DirectByteBuffer write_buffer3 = DirectByteBufferPool.getBuffer(DirectByteBuffer.AL_OTHER,512); cf.writeAndHandoverBuffer( write_buffer2, 512 ); cf.flushCache(); cf.writeAndHandoverBuffer( write_buffer3, 1024 ); cf.writeAndHandoverBuffer( write_buffer1, 0 ); cf.flushCache(); write_buffer1 = DirectByteBufferPool.getBuffer(DirectByteBuffer.AL_OTHER,512); cf.writeAndHandoverBuffer( write_buffer1, 0 ); cf.flushCache(); cf.close(); }catch( Throwable e ){ Debug.printStackTrace( e ); } } public void randomTest( CacheFileManager manager ) { try{ CacheFile[] files = new CacheFile[3]; byte[][] file_data = new byte[3][]; for (int i=0;i<files.length;i++){ final int f_i = i; file_data[i] = new byte[randomInt(200000)]; files[i] = manager.createFile( new CacheFileOwner() { public String getCacheFileOwnerName() { return( "file" + f_i ); } public TOTorrentFile getCacheFileTorrentFile() { return( null ); } public File getCacheFileControlFile(String name) { return null; } public int getCacheMode() { return( CacheFileOwner.CACHE_MODE_NORMAL ); } }, new File( "C:\\temp\\cachetest" + i + ".dat" ), CacheFile.CT_LINEAR); files[i].setAccessMode( CacheFile.CF_WRITE ); DirectByteBuffer bb = DirectByteBufferPool.getBuffer(DirectByteBuffer.AL_OTHER,file_data[i].length); bb.put( DirectByteBuffer.SS_CACHE, file_data[i]); bb.position(DirectByteBuffer.SS_CACHE, 0); files[i].write(bb,0); } int quanitize_to = 100; int quanitize_to_max_consec_write = 1; int quanitize_to_max_consec_read = 3; for (int x=0;x<10000000;x++){ int file_index = randomInt(files.length); CacheFile cf = files[file_index]; byte[] bytes = file_data[ file_index ]; int p1 = randomInt( bytes.length ); int p2 = randomInt( bytes.length ); p1 = (p1/quanitize_to)*quanitize_to; p2 = (p2/quanitize_to)*quanitize_to; if ( p1 == p2 ){ continue; } int start = Math.min(p1,p2); int len = Math.max(p1,p2) - start; int function = randomInt(100); if ( function < 30){ if ( len > quanitize_to*quanitize_to_max_consec_read ){ len = quanitize_to*quanitize_to_max_consec_read; } DirectByteBuffer buffer = DirectByteBufferPool.getBuffer( DirectByteBuffer.AL_OTHER,len ); System.out.println( "read:" + start + "/" + len ); cf.read( buffer, start, CacheFile.CP_READ_CACHE ); buffer.position(DirectByteBuffer.SS_CACHE, 0); byte[] data_read = new byte[len]; buffer.get( DirectByteBuffer.SS_CACHE, data_read ); for (int i=0;i<data_read.length;i++){ if ( data_read[i] != bytes[ i+start ]){ throw( new Exception( "data read mismatch" )); } } buffer.returnToPool(); }else if ( function < 80 ){ if ( len > quanitize_to*quanitize_to_max_consec_write ){ len = quanitize_to*quanitize_to_max_consec_write; } System.out.println( "write:" + start + "/" + len ); DirectByteBuffer buffer = DirectByteBufferPool.getBuffer( DirectByteBuffer.AL_OTHER,len ); for (int i=0;i<len;i++){ bytes[start+i] = (byte)randomInt(256); buffer.put( DirectByteBuffer.SS_CACHE, bytes[start+i]); } buffer.position(DirectByteBuffer.SS_CACHE, 0); cf.writeAndHandoverBuffer( buffer, start ); }else if ( function < 90 ){ cf.flushCache(); }else if ( function < 91 ){ cf.clearCache(); //System.out.println( "closing file" ); //cf.close(); } } }catch( Throwable e ){ Debug.printStackTrace( e ); } } static int randomInt( int num ) { return( (int)(Math.random()*num )); } }