So we may of found a problem?

Could you construct a test case I can run; I am having a hard time remember the 
difference between memory lock and transaction lock and could use a refresher 
:-)

Jody

On 08/09/2010, at 5:23 PM, Yingqi Tang wrote:

> Jody,
> 
> Thanks for pointing out the samples in "main" module. I actually went through 
> those JUnit tests but they are all either using AUTO_COMMIT transaction or 
> the MemoryLock (the one generated by calling FeatureLockFactory.generate()), 
> and there are actually some similar ones in JDBC module tests. But none of 
> those uses the TransactionLock, which is the one that causes problem. I 
> actually did an experiment by commenting out a chunk of code in 
> InProcessLockingManager class that only relates to TransactionLock (the code 
> will only be executed when FeatureLock.TRANSACTION is used), and all the 
> JUnit tests still passed without problem.
> 
> The code I was looking at is in InProcessLockingManager line 89 - 111
> 
>             if (lock instanceof TransactionLock) {
>                 TransactionLock tlock = (TransactionLock) lock;
> 
>                 if (transaction == tlock.transaction) {
>                     // lock already held by this transacstion
>                     // we could just consider returning here
>                     //
>                     throw new FeatureLockException("Transaction Lock is 
> already held by this Transaction",
>                         featureID);
>                 } else {
>                     // we should wait till it is available and then grab
>                     // the lock
>                     try {
>                         synchronized (tlock) {
>                             tlock.wait();
>                         }
> 
>                         lock = getLock(typeName, featureID);
>                     } catch (InterruptedException interupted) {
>                         throw new FeatureLockException("Interupted while 
> waiting for Transaction Lock",
>                             featureID, interupted);
>                     }
>                 }
> 
> 
> 
> On Wed, Sep 8, 2010 at 4:06 AM, Jody Garnett <[email protected]> wrote:
> - FeatureLockTest.java
> - 
>> 
>> http://svn.osgeo.org/geotools/trunk/modules/library/main/src/test/java/org/geotools/data/memory/MemoryDataStoreTest.java
> 
> Examples
>     public void testLockFeatures() throws IOException {
>         FeatureLock lock = FeatureLockFactory.generate("test", 3600);
>         FeatureLocking<SimpleFeatureType, SimpleFeature> road = 
> (FeatureLocking<SimpleFeatureType, SimpleFeature>) 
> data.getFeatureSource("road");
>         road.setFeatureLock(lock);
> 
>         assertFalse(isLocked("road", "road.rd1"));
>         road.lockFeatures();
>         assertTrue(isLocked("road", "road.rd1"));
>     }
> 
> public void testUnLockFeatures() throws IOException {
>         FeatureLock lock = FeatureLockFactory.generate("test", 3600);
>         FeatureLocking<SimpleFeatureType, SimpleFeature> road = 
> (FeatureLocking<SimpleFeatureType, SimpleFeature>) 
> data.getFeatureSource("road");
>         road.setFeatureLock(lock);
>         road.lockFeatures();
> 
>         try {
>             road.unLockFeatures();
>             fail("unlock should fail due on AUTO_COMMIT");
>         } catch (IOException expected) {
>         }
>         Transaction t = new DefaultTransaction();
>         road.setTransaction(t);
>         try {
>             road.unLockFeatures();
>             fail("unlock should fail due lack of authorization");
>         } catch (IOException expected) {
>         }
>         t.addAuthorization(lock.getAuthorization());
>         road.unLockFeatures();
>     }
> 
> public void testLockFeatureInteraction() throws IOException {
>         FeatureLock lockA = FeatureLockFactory.generate("LockA", 3600);
>         FeatureLock lockB = FeatureLockFactory.generate("LockB", 3600);
>         Transaction t1 = new DefaultTransaction();
>         Transaction t2 = new DefaultTransaction();
>         FeatureLocking<SimpleFeatureType, SimpleFeature> road1 = 
> (FeatureLocking<SimpleFeatureType, SimpleFeature>) 
> data.getFeatureSource("road");
>         FeatureLocking<SimpleFeatureType, SimpleFeature> road2 = 
> (FeatureLocking<SimpleFeatureType, SimpleFeature>) 
> data.getFeatureSource("road");
>         road1.setTransaction(t1);
>         road2.setTransaction(t2);
>         road1.setFeatureLock(lockA);
>         road2.setFeatureLock(lockB);
> 
>         assertFalse(isLocked("road", "road.rd1"));
>         assertFalse(isLocked("road", "road.rd2"));
>         assertFalse(isLocked("road", "road.rd3"));
> 
>         road1.lockFeatures(rd1Filter);
>         assertTrue(isLocked("road", "road.rd1"));
>         assertFalse(isLocked("road", "road.rd2"));
>         assertFalse(isLocked("road", "road.rd3"));
> 
>         road2.lockFeatures(rd2Filter);
>         assertTrue(isLocked("road", "road.rd1"));
>         assertTrue(isLocked("road", "road.rd2"));
>         assertFalse(isLocked("road", "road.rd3"));
> 
>         try {
>             road1.unLockFeatures(rd1Filter);
>             fail("need authorization");
>         } catch (IOException expected) {
>         }
>         t1.addAuthorization(lockA.getAuthorization());
>         try {
>             road1.unLockFeatures(rd2Filter);
>             fail("need correct authorization");
>         } catch (IOException expected) {
>         }
>         road1.unLockFeatures(rd1Filter);
>         assertFalse(isLocked("road", "road.rd1"));
>         assertTrue(isLocked("road", "road.rd2"));
>         assertFalse(isLocked("road", "road.rd3"));
> 
>         t2.addAuthorization(lockB.getAuthorization());
>         road2.unLockFeatures(rd2Filter);
>         assertFalse(isLocked("road", "road.rd1"));
>         assertFalse(isLocked("road", "road.rd2"));
>         assertFalse(isLocked("road", "road.rd3"));
>     }
>  public void testGetFeatureLockingExpire() throws Exception {
>         FeatureLock lock = FeatureLockFactory.generate("Timed", 500);        
>         FeatureLocking<SimpleFeatureType, SimpleFeature> road = 
> (FeatureLocking<SimpleFeatureType, SimpleFeature>) 
> data.getFeatureSource("road");
>         road.setFeatureLock(lock);
>         assertFalse(isLocked("road", "road.rd1"));
>         road.lockFeatures(rd1Filter);
>         assertTrue(isLocked("road", "road.rd1"));
>         long then = System.currentTimeMillis();
>         do {
>             Thread.sleep( 15 );            
>         } while ( then > System.currentTimeMillis() - 515 );     
>         assertFalse(isLocked("road", "road.rd1"));
>     }
> 
> On 08/09/2010, at 12:19 AM, Augusttown wrote:
> 
>> 
>> Jody,
>> 
>> Is there a JUnit test or example written for testing
>> FeatureLock.TRANSACTION? There seems to be a problem when using
>> FeatureLock.TRANSACTION to lock and modify features. There is always a
>> java.lang.IllegalMonitorStateException exception being thrown out when the
>> release() is called on instance of TransactionLock. The change has actually
>> been committed to the database already before the exception.
>> 
>> I'm kind of stuck here, and I don't think there is any JUnit tests or sample
>> written using FeatureLock.TRANSACTION. Will source code of GeoServer shed
>> any light on this?
>> 
>> The code below will reproduce the issue:
>> 
>> for(int i=0; i<4; i++) {
>>            // spread a new thread
>>            final String id = String.valueOf(i);
>>            threadPool.execute(
>>                new Runnable() {                   
>>                    public void run() {
>>                        try {
>>                            String targetFeatureTypeName =
>> "sf_pizzastores_wgs84";       
>>                            JDBCFeatureStore jdbcFeatureStore =
>> (JDBCFeatureStore)jdbcDataStore.getFeatureSource(targetFeatureTypeName);     
>>                                                                 
>>                            Transaction transaction = new
>> DefaultTransaction();                                                        
>>                               
>>                            FeatureLock featureLock =
>> FeatureLock.TRANSACTION;                                                     
>>              
>>                            String lockId = featureLock.getAuthorization();
>>                            jdbcFeatureStore.setTransaction(transaction);     
>>                       
>>                            jdbcFeatureStore.setFeatureLock(featureLock);     
>>                       
>>                            transaction.addAuthorization(lockId);             
>>                                           
>>                            FeatureWriter<SimpleFeatureType, SimpleFeature>
>> featureWriter = jdbcDataStore.getFeatureWriter(targetFeatureTypeName,
>> transaction);                                                               
>>                            jdbcFeatureStore.lockFeatures();                  
>>                                 
>>                            while(featureWriter.hasNext()) {               
>>                                SimpleFeature simpleFeature =
>> featureWriter.next();               
>>                                String store_id =
>> (String)simpleFeature.getAttribute("store_id");
>>                                simpleFeature.setAttribute("name", "ps"+ id
>> + "." + store_id);                                                           
>>                                transaction.addAuthorization(lockId);         
>>                       
>>                                featureWriter.write();                        
>>        
>>                            }
>>                            try {                                             
>>                                   
>>                                transaction.addAuthorization(lockId);         
>>                                   
>>                                transaction.commit();                         
>>   
>>                            } catch(Exception e) {                            
>>                                                    
>>                                 transaction.rollback();
>>                                 e.printStackTrace();
>>                            } finally {           
>>                                transaction.addAuthorization(lockId);         
>>                                                       
>>                                jdbcFeatureStore.unLockFeatures();            
>>                                    
>>                                featureWriter.close();
>>                                transaction.close();
>>                            }                   
>>                        } catch(Exception e) {                               
>>                            e.printStackTrace();
>>                        } finally {
>>                        }
>>                    }
>>                }
>>            );   
>>        }
>>        threadPool.shutdown();
>> -- 
>> View this message in context: 
>> http://osgeo-org.1803224.n2.nabble.com/How-to-use-FeatureLock-TRANSACTION-when-modifying-features-and-committing-changes-tp5491953p5508478.html
>> Sent from the geotools-gt2-users mailing list archive at Nabble.com.
>> 
>> ------------------------------------------------------------------------------
>> This SF.net Dev2Dev email is sponsored by:
>> 
>> Show off your parallel programming skills.
>> Enter the Intel(R) Threading Challenge 2010.
>> http://p.sf.net/sfu/intel-thread-sfd
>> _______________________________________________
>> Geotools-gt2-users mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users
> 
> 

------------------------------------------------------------------------------
Automate Storage Tiering Simply
Optimize IT performance and efficiency through flexible, powerful, 
automated storage tiering capabilities. View this brief to learn how
you can reduce costs and improve performance. 
http://p.sf.net/sfu/dell-sfdev2dev
_______________________________________________
Geotools-gt2-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to