Client.java revision d81978a0815d5b8a75633c35e3e1f8708d36f017
// 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<String> 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<String>();
// 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 <host>] [-p <port>] -b <base_dn> "
+ "[-D <bindDN> ] [-w <bindPW> ] [-t <nb_threads>] [-M <nb_max_mods>] [-a <attribute>] [-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 );
}
}