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/FeatureLockTest.java>
>
> <http://svn.osgeo.org/geotools/trunk/modules/library/main/src/test/java/org/geotools/data/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
>
>
>
------------------------------------------------------------------------------
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