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