You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by "Chathura Ekanayake (JIRA)" <ji...@apache.org> on 2007/05/05 07:00:16 UTC

[jira] Created: (WSCOMMONS-201) UUIDGenerator generates same ID multiple times when invoked from multiple threads

UUIDGenerator generates same ID multiple times when invoked from multiple threads
---------------------------------------------------------------------------------

                 Key: WSCOMMONS-201
                 URL: https://issues.apache.org/jira/browse/WSCOMMONS-201
             Project: WS-Commons
          Issue Type: Bug
          Components: AXIOM
         Environment: Ubuntu 6.06, JDK 1.5
            Reporter: Chathura Ekanayake


org.apache.axiom.om.util.UUIDGenerator generates same UUID more than once, when the UUIDGenerator.getUUID() is invoked from multiple threads concurrently. I have tested this with 100 threads, each invoking the getUUID() 1000 times. UUIDGenerator generates about 1500 to 3000 same IDs for 100000 invocations.

I am listing the code I have used to test this below:

package uuidtest;

import org.apache.axiom.om.util.UUIDGenerator;

import java.util.*;

public class UUIDGenTest {

   private static final int THREADS = 100;
   private static final int ITERATIONS = 1000;

   Map generatedIds = Collections.synchronizedMap(new HashMap());
    int errorCount = 0;
   Object lock = new Object();

   public static void main(String[] args) {
       new UUIDGenTest().test();
   }

   public void test() {

       Thread[] threads = new Thread[THREADS];
       for (int i = 0; i < THREADS; i++) {
           threads[i] = new Thread(new Generate());
           threads[i].start();
       }

       for (int i = 0; i < THREADS; i++) {
           try {
               threads[i].join();
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
       System.out.println("=======================================================");
       System.out.println("  Error count : " + errorCount + " for " + THREADS * ITERATIONS);
       System.out.println("=======================================================");
   }

   class Generate implements Runnable {
       public void run() {
           for (int i=0; i<ITERATIONS; i++) {
               String id = UUIDGenerator.getUUID();
               if (generatedIds.containsKey(id)) {
                   System.out.println("ERROR - Same UUID has been generated before. UUID: " + id);
                   synchronized(lock) {
                       errorCount++;
                   }
               }
               generatedIds.put(id, Thread.currentThread().getName());
           }
       }
   }
}

If you compile and run this with AXIOM jars in the classpath, you could observe an error count about 1500 to 3000.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: commons-dev-help@ws.apache.org


[jira] Resolved: (WSCOMMONS-201) UUIDGenerator generates same ID multiple times when invoked from multiple threads

Posted by "Eran Chinthaka 2 (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WSCOMMONS-201?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eran Chinthaka 2 resolved WSCOMMONS-201.
----------------------------------------

    Resolution: Fixed
      Assignee: Eran Chinthaka

Well the problem was due to a synchronization issue. I did all the hacks some time back to this method as this was a hot spot for performance measurements. Since Chathura is keen getting this right, I am making it synchronized again. 
BTW, please remember that this is not a fully fledged UUID generator. Since this is a hot spot, we wanted to have a minimal version which is just enough for the system. 

> UUIDGenerator generates same ID multiple times when invoked from multiple threads
> ---------------------------------------------------------------------------------
>
>                 Key: WSCOMMONS-201
>                 URL: https://issues.apache.org/jira/browse/WSCOMMONS-201
>             Project: WS-Commons
>          Issue Type: Bug
>          Components: AXIOM
>         Environment: Ubuntu 6.06, JDK 1.5
>            Reporter: Chathura Ekanayake
>         Assigned To: Eran Chinthaka
>
> org.apache.axiom.om.util.UUIDGenerator generates same UUID more than once, when the UUIDGenerator.getUUID() is invoked from multiple threads concurrently. I have tested this with 100 threads, each invoking the getUUID() 1000 times. UUIDGenerator generates about 1500 to 3000 same IDs for 100000 invocations.
> I am listing the code I have used to test this below:
> package uuidtest;
> import org.apache.axiom.om.util.UUIDGenerator;
> import java.util.*;
> public class UUIDGenTest {
>    private static final int THREADS = 100;
>    private static final int ITERATIONS = 1000;
>    Map generatedIds = Collections.synchronizedMap(new HashMap());
>     int errorCount = 0;
>    Object lock = new Object();
>    public static void main(String[] args) {
>        new UUIDGenTest().test();
>    }
>    public void test() {
>        Thread[] threads = new Thread[THREADS];
>        for (int i = 0; i < THREADS; i++) {
>            threads[i] = new Thread(new Generate());
>            threads[i].start();
>        }
>        for (int i = 0; i < THREADS; i++) {
>            try {
>                threads[i].join();
>            } catch (InterruptedException e) {
>                e.printStackTrace();
>            }
>        }
>        System.out.println("=======================================================");
>        System.out.println("  Error count : " + errorCount + " for " + THREADS * ITERATIONS);
>        System.out.println("=======================================================");
>    }
>    class Generate implements Runnable {
>        public void run() {
>            for (int i=0; i<ITERATIONS; i++) {
>                String id = UUIDGenerator.getUUID();
>                if (generatedIds.containsKey(id)) {
>                    System.out.println("ERROR - Same UUID has been generated before. UUID: " + id);
>                    synchronized(lock) {
>                        errorCount++;
>                    }
>                }
>                generatedIds.put(id, Thread.currentThread().getName());
>            }
>        }
>    }
> }
> If you compile and run this with AXIOM jars in the classpath, you could observe an error count about 1500 to 3000.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: commons-dev-help@ws.apache.org