[rules-users] does WorkingMemory.iterator support remove()?

Michael Anstis michael.anstis at googlemail.com
Fri Oct 5 15:40:45 EDT 2007


Excuse me if this would be best posted to the developer list...

...but let me undertstand: The Fact table maintained for a WorkingMemory is
not thread safe(?); however WorkingMemories are thread safe - suggesting
Shadow Facts and (excuse my vague terminolgy) Node Memories are the thread
safe aspect of working memories - the Fact table containing references to
the original inserted objects not the Shadows. So if a Fact is removed using
my "unsafe" code it will cause Shadow Facts to become disconnected from
their original non-shadowed Fact? Would using ThreadLocal storage for the
Fact table (together with node memories and shadow facts) mean a complete
thread-safe Drools? I don't mean this to become a tutorial in either Drools
threading or general java thread safety!! (I don't think there's a category
on the "how to have your emails ignored" listing for this). I just want to
increase my awareness of (Drools) threading issues... and this proves a good
example.


On 05/10/2007, Mark Proctor <mproctor at codehaus.org> wrote:
>
> Anstis, Michael (M.) wrote:
>
> Wouldn't the best approach be to get the FactHandles iterator and retact
> them from working memory rather than removing them through the iterator?
>
> Iterator itr = wm.iterateFactHandles();
> While(itr.next()) {
> 	FactHandle h = itr.next();
> 	wm.retract(h);
> }
>
> This would ensure truth maintenance is preserved.
>
>
> Actually I'm not sure that would be safe.... the objects and the handles
> are in the same hashtable. Those internal data structures where built for
> performance and lightweightness, not thread safeness and mutability. If you
> actually look we have an internal, fast, iterator which we simple adapt to a
> slower java.util.Iterator. At the moment none of our iterators are thread
> safe, but I do see a valid use case here, we will have to think on it for
> the next major release - cleam implementation patch welcome with unit tests
> :) I'm less concerned about the iterator adapter performance, but I cannot
> compromise on the performance of our internal iterators.
>
>     public static class HashTableIterator
>         implements
>         Iterator {
>
>         private static final long serialVersionUID = 400L;
>
>         private AbstractHashTable hashTable;
>         private Entry[]           table;
>         private int               row;
>         private int               length;
>         private Entry             entry;
>
>         public HashTableIterator(final AbstractHashTable hashTable) {
>             this.hashTable = hashTable;
>         }
>
>         /* (non-Javadoc)
>          * @see org.drools.util.Iterator#next()
>          */
>         public Object next() {
>             if ( this.entry == null ) {
>                 // keep skipping rows until we come to the end, or find
> one that is populated
>                 while ( this.entry == null ) {
>                     this.row++;
>                     if ( this.row == this.length ) {
>                         return null;
>                     }
>                     this.entry = this.table[this.row];
>                 }
>             } else {
>                 this.entry = this.entry.getNext();
>                 if ( this.entry == null ) {
>                     this.entry = (Entry) next();
>                 }
>             }
>
>             return this.entry;
>         }
>
>         /* (non-Javadoc)
>          * @see org.drools.util.Iterator#reset()
>          */
>         public void reset() {
>             this.table = this.hashTable.getTable();
>             this.length = this.table.length;
>             this.row = -1;
>             this.entry = null;
>         }
>     }
>
> -----Original Message-----
> From: rules-users-bounces at lists.jboss.org
> [mailto:rules-users-bounces at lists.jboss.org <rules-users-bounces at lists.jboss.org>] On Behalf Of Godmar Back
> Sent: 05 October 2007 16:40
> To: Rules Users List
> Subject: Re: [rules-users] does WorkingMemory.iterator support remove()?
>
> Thanks - consider supporting it for efficiency. (Otherwise, removing a
> set of facts from working memory requires a temporary container to
> hold the facts to be removed.)
>
>  - Godmar
>
> On 10/5/07, Mark Proctor <mproctor at codehaus.org> <mproctor at codehaus.org> wrote:
>
>
> Godmar Back wrote:
>
>
> Does the iterator returned by WorkingMemory.iterator support remove()?
>
> I checked the javadoc and the Drools manual, but may have missed it.
>
>
>
> If you try it you'll get an exception thrown
>
>
> "UnsupportedOperationException"
>
>
> http://anonsvn.labs.jboss.com/labs/jbossrules/trunk/drools-core/src/main/jav
> a/org/drools/util/JavaIteratorAdapter.java
>
>
>  Please answer and augment documentation.
>
>  - Godmar
> _______________________________________________
> rules-users mailing listrules-users at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-users
>
>
>       _______________________________________________
> rules-users mailing listrules-users at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-users
>
>     _______________________________________________
> rules-users mailing listrules-users at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-users
>
> ------------------------------
>
> _______________________________________________
> rules-users mailing listrules-users at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20071005/dfede675/attachment.html 


More information about the rules-users mailing list