Affects Version/s: 0.21.0
Fix Version/s: None
Looking at INode, I can see that the long permissions field is updated in the synchronized updatePermissions, read in other non-synchronized contexts
I believe that to avoid race conditions and other synchronisation problems, the field should be marked volatile
- The Java language specification declares that long and double can be written as two 32-bit writes, unless the field is volatile http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html#28733
- The JVM is free to re-order accesses to non-volatile data; reads of the permission may pick up out of date values
- Volatile data may be cached/optimised out, changes may not propagate
I don't think its enough to make the write operation synchronised, as the reads are still unsynchronized, and in other threads can pick up values midway through the update, or cache the value.
It's a simple fix: declare permissions as volatile.