Sure, I will create a test case soon.
On Thu, Sep 9, 2010 at 11:05 PM, Jody Garnett <[email protected]>wrote:
> 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/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
>>
>>
>>
>
>
------------------------------------------------------------------------------
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