// CDDL HEADER START // // The contents of this file are subject to the terms of the // Common Development and Distribution License, Version 1.0 only // (the "License"). You may not use this file except in compliance // with the License. // // You can obtain a copy of the license at // trunk/opends/resource/legal-notices/OpenDS.LICENSE // or https://OpenDS.dev.java.net/OpenDS.LICENSE. // See the License for the specific language governing permissions // and limitations under the License. // // When distributing Covered Code, include this CDDL HEADER in each // file and include the License file at // trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, // add the following below this CDDL HEADER, with the fields enclosed // information: // Portions Copyright [yyyy] [name of copyright owner] // // CDDL HEADER END // // // Copyright 2008 Sun Microsystems, Inc. import netscape.ldap.*; import netscape.ldap.util.*; import java.util.*; import java.io.*; import java.lang.Thread; public class Client { // static String dn="cn=Directory Manager"; // static String password="secret12"; static int NB_MAX_MODS=100; static Object lock; static int nb_mods_started=0; static int nb_mods_done=0; static int total_nb_mods=0; static int nb_threads=3; public ArrayList DNList; // String dn="cn=admin,dc=com"; // String dn="cn=Directory Manager"; // String password="secret12"; Random random; static String attr="description"; public String attribute; static String hostname ; static int portnumber; static String bindDN; static String bindPW; static String suffix; static Server server; static String time= new String ("0 sec.");; static long duration=0; static long maxDuration=0; static long startup=System.currentTimeMillis(); public Client() { attribute=attr; random=new Random(); lock = new Object(); DNList=new ArrayList(); // println("INFO", "Getting DN from file " + DNFileName); try { println ("INFO", "Get the DNs on suffix \"" + suffix + "\" from server " + server ); LDAPConnection c = new LDAPConnection(); // no bind c.connect( server.host, server.port); println ("INFO", "Connected to server " + server ); // bind if needed if ( bindDN != null ) { println ("INFO", "Binding as \"" + bindDN + "\""); c.bind(bindDN, bindPW); } else { println ("INFO", "Anonymous mode (no bind)"); } // no limit for nb of entries returned by a search Integer sizeLimit = new Integer( 0 ); c.setOption( LDAPv3.SIZELIMIT, sizeLimit ); LDAPSearchResults results = c.search( suffix, LDAPv3.SCOPE_SUB, "(objectclass=*)" , new String[] {"dn"} , false ); while ( results.hasMoreElements() ) { Object o=null; try { o=results.nextElement(); LDAPEntry entry=(LDAPEntry) o; // println("DEBUG", "DN="+entry.getDN()); DNList.add(entry.getDN()); } catch (java.lang.ClassCastException e) { e.printStackTrace(); println ("ERROR", o.toString() ); } } DNList.trimToSize(); if ( DNList.size() == 0) { println("ERROR", "No entry found in \"" + suffix + "\""); System.exit(1); } println("INFO", "Found " + DNList.size() + " entries in \"" + suffix + "\" on " + server.toString() ); c.disconnect(); } catch (LDAPException e) { int errorCode = e.getLDAPResultCode(); if ( errorCode == 32) { println ("WARNING", "No entry found in suffix \"" + suffix + "\""); } else { e.printStackTrace(); } System.exit(1); } /* try { File DNFile= new File(DNFileName); LineNumberReader in=new LineNumberReader (new FileReader(DNFile) ); while ( in.ready() ) { DNList.add(in.readLine()); } } catch (IOException e) { println ("ERROR", e.toString()); System.exit(1); }*/ // DNList.trimToSize(); //println("INFO", "Found " + DNList.size() + " DNs"); try { // reinitialize startup startup=System.currentTimeMillis(); long t1=System.currentTimeMillis(); if ( maxDuration != 0 ) { maxDuration= t1 + maxDuration * 1000; } for (int i=0; i < nb_threads; i++ ) { Worker w=new Worker(this, server); } println ("INFO", nb_threads + " threads connected to server " + server ); println ("INFO", "Will replace attribute " + attr + " (MAX =" + NB_MAX_MODS + ")" ); int seconds=0; while (true) { long new_t1=System.currentTimeMillis(); if ( ( maxDuration != 0 ) && ( new_t1 > maxDuration ) ) { break; } if ( (new_t1 - t1) >= 1000 ) { println("INFO", nb_mods_done + " mods/sec."); // (time = "+(new_t1-t1) + "ms)"); // println("DEBUG", nb_mods_started + " mods/sec started"); total_nb_mods+=nb_mods_done; nb_mods_started=0; nb_mods_done=0; synchronized (lock) { lock.notifyAll(); } if ( (seconds++) >= 9 ) { duration=((new_t1-startup)/1000); println("INFO", "Avg rate: " + (total_nb_mods/duration) + " mods/sec. after " + getTime(duration)); seconds=0; } t1=new_t1; } } System.exit(0); } catch( Exception e ) { e.printStackTrace(); System.exit(1); } } public static String getTime(long d) { String time=new String (d + " sec."); if ( d > 10000 ) { time=new String ((d/3600) + " hours"); } else if ( d > 300 ) { time=new String ((d/60) + " min."); } return time; } public static void main( String[] args ) { String usage = "Usage: java Main [-h ] [-p ] -b " + "[-D ] [-w ] [-t ] [-M ] [-a ] [-d duration (seconds)]"; int portnumber = LDAPv2.DEFAULT_PORT; // Check for these options. -H means to print out a usage message. GetOpt options = new GetOpt( "h:p:b:d:D:w:H:t:M:a:", args ); // Get the arguments specified for each option. hostname = options.getOptionParam( 'h' ); String port = options.getOptionParam( 'p' ); bindDN = options.getOptionParam( 'D' ); bindPW = options.getOptionParam( 'w' ); suffix = options.getOptionParam( 'b' ); if ( options.hasOption( 't' ) ) { nb_threads=Integer.parseInt(options.getOptionParam( 't' )); } if ( options.hasOption( 'M' ) ) { NB_MAX_MODS=Integer.parseInt(options.getOptionParam( 'M' )); } if ( options.hasOption( 'a' ) ) { attr=options.getOptionParam( 'a' ); } if ( options.hasOption( 'd' ) ) { String sMaxDuration=options.getOptionParam( 'd' ); maxDuration = Long.parseLong(sMaxDuration); } // option -DM to use default QA settings for Directory manager if ( bindDN != null && bindDN.equals("M") ) { bindDN="cn=Directory Manager"; bindPW="secret12"; } // Check to see if the hostname (which is mandatory) // is not specified or if the user simply wants to // see the usage message (-H). if ( options.hasOption( 'H' ) || ( suffix == null ) ) { System.out.println( usage ); System.exit( 1 ); } if ( hostname == null ) hostname="localhost"; // If a port number was specified, convert the port value // to an integer. if ( port != null ) { try { portnumber = java.lang.Integer.parseInt( port ); } catch ( java.lang.Exception e ) { System.out.println( "Invalid port number: " + port ); System.out.println( usage ); System.exit( 1 ); } } else { portnumber=1389; } server=new Server(hostname,portnumber); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { duration=((System.currentTimeMillis()-startup)/1000); if ( duration != 0 ) println("INFO", "TOTAL: " + total_nb_mods + " mods (Avg rate: " + (total_nb_mods/duration) + " mods/sec.) after " + getTime(duration)); } }); Client c = new Client(); } public static void inc_mods_started() { check_mods_started(); nb_mods_started++; } public static void inc_mods_done() { nb_mods_done++; } public static void check_mods_started() { if ( nb_mods_started>=NB_MAX_MODS ) { //println("DEBUG", "Mods=" + nb_mods); try { synchronized (lock) { lock.wait(); } } catch ( InterruptedException e ) { e.printStackTrace(); } } } public static void wait_after_error() { try { synchronized (lock) { lock.wait(); } } catch ( InterruptedException e ) { e.printStackTrace(); } } public static void sleep(int time) { try { Thread.sleep(time); } catch ( InterruptedException e ) { println( "ERROR" , e.toString() ); } } public static String getDate() { // Initialize the today's date string String DATE_FORMAT = "yyyy/MM/dd:HH:mm:ss"; java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(DATE_FORMAT); Calendar c1 = Calendar.getInstance(); // today return("[" + sdf.format(c1.getTime()) + "]"); } public static void println(String level, String msg) { System.out.println (getDate() + " - " + level + ": " + msg ); } }