org.jboss.cache.loader
Class SharedStoreCacheLoader

java.lang.Object
  extended byorg.jboss.cache.loader.SharedStoreCacheLoader
All Implemented Interfaces:
CacheLoader (src) , Service (src) , TreeCacheListener (src)

public class SharedStoreCacheLoader
extends java.lang.Object
implements TreeCacheListener (src) , CacheLoader (src)

CacheLoader proxy used only when multiple CacheLoaders in a cluster access the same underlying store (e.g. a shared filesystem, or DB). SharedStoreCacheLoader is a simply facade to a real CacheLoader implementation. It always delegates reads to the real CacheLoader. Writes are forwarded only if this SharedStoreCacheLoader is currently the cordinator. This avoid having all CacheLoaders in a cluster writing the same data to the same underlying store. Although not incorrect (e.g. a DB will just discard additional INSERTs for the same key, and throw an exception), this will avoid a lot of redundant work.
Whenever the current coordinator dies (or leaves), the second in line will take over. That SharedStoreCacheLoader will then pass writes through to its underlying CacheLoader.


Constructor Summary
SharedStoreCacheLoader(CacheLoader (src)  loader, Address local_addr, boolean coordinator)
           
 
Method Summary
 void cacheStarted(TreeCache (src)  cache)
          Called when the cache is started.
 void cacheStopped(TreeCache (src)  cache)
          Called when the cache is stopped.
 void commit(java.lang.Object tx)
          Commit the transaction.
 void create()
          create the service, do expensive operations etc
 void destroy()
          destroy the service, tear down
 boolean exists(Fqn (src)  name)
          Checks whether the CacheLoader has a node with Fqn
 java.util.Map get(Fqn (src)  name)
          Returns all keys and values from the persistent store, given a fully qualified name
 java.lang.Object get(Fqn (src)  name, java.lang.Object key)
          Returns the value for a given key.
 java.util.Set getChildrenNames(Fqn (src)  fqn)
          Returns a list of children names, all names are relative.
 byte[] loadEntireState()
          Fetch the entire state for this cache from secondary storage (disk, DB) and return it as a byte buffer.
 void nodeCreated(Fqn (src)  fqn)
          Called when a node is created
 void nodeEvicted(Fqn (src)  fqn)
          Called when a node is evicted (not the same as remove()).
 void nodeLoaded(Fqn (src)  fqn)
          Called when a node is loaded into memory via the CacheLoader.
 void nodeModified(Fqn (src)  fqn)
          Called when a node is modified, e.g., one (key, value) pair in the internal map storage has been modified.
 void nodeRemoved(Fqn (src)  fqn)
          Called when a node is removed.
 void nodeVisited(Fqn (src)  fqn)
          Called when a node is visisted, i.e., get().
 void prepare(java.lang.Object tx, java.util.List modifications, boolean one_phase)
          Prepare the modifications.
 void put(Fqn (src)  name, java.util.Map attributes)
          Inserts all elements of attributes into the attributes hashmap of the given node, overwriting existing attributes, but not clearing the existing hashmap before insertion (making it a union of existing and new attributes) If the node does not exist, all parent nodes from the root down are created automatically
 java.lang.Object put(Fqn (src)  name, java.lang.Object key, java.lang.Object value)
          Inserts key and value into the attributes hashmap of the given node.
 void put(java.util.List modifications)
          Inserts all modifications to the backend store.
 void remove(Fqn (src)  name)
          Removes the given node.
 java.lang.Object remove(Fqn (src)  name, java.lang.Object key)
          Removes the given key and value from the attributes of the given node.
 void removeData(Fqn (src)  name)
          Removes all attributes from a given node, but doesn't delete the node itself
 void rollback(java.lang.Object tx)
          Roll the transaction back.
 void setCache(TreeCache (src)  c)
          This method allows the CacheLoader to set the TreeCache, therefore allowing the CacheLoader to invoke methods of the TreeCache.
 void setConfig(java.util.Properties props)
          Sets the configuration.
 void start()
          start the service, create is already called
 void stop()
          stop the service
 void storeEntireState(byte[] state)
          Store the given state in secondary storage.
 void viewChange(View new_view)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

SharedStoreCacheLoader

public SharedStoreCacheLoader(CacheLoader (src)  loader,
                              Address local_addr,
                              boolean coordinator)
Method Detail

nodeCreated

public void nodeCreated(Fqn (src)  fqn)
Description copied from interface: TreeCacheListener (src)
Called when a node is created

Specified by:
nodeCreated in interface TreeCacheListener (src)
Parameters:
fqn -

nodeRemoved

public void nodeRemoved(Fqn (src)  fqn)
Description copied from interface: TreeCacheListener (src)
Called when a node is removed.

Specified by:
nodeRemoved in interface TreeCacheListener (src)
Parameters:
fqn -

nodeLoaded

public void nodeLoaded(Fqn (src)  fqn)
Description copied from interface: TreeCacheListener (src)
Called when a node is loaded into memory via the CacheLoader. This is not the same as TreeCacheListener.nodeCreated(Fqn).

Specified by:
nodeLoaded in interface TreeCacheListener (src)

nodeEvicted

public void nodeEvicted(Fqn (src)  fqn)
Description copied from interface: TreeCacheListener (src)
Called when a node is evicted (not the same as remove()).

Specified by:
nodeEvicted in interface TreeCacheListener (src)
Parameters:
fqn -

nodeModified

public void nodeModified(Fqn (src)  fqn)
Description copied from interface: TreeCacheListener (src)
Called when a node is modified, e.g., one (key, value) pair in the internal map storage has been modified.

Specified by:
nodeModified in interface TreeCacheListener (src)
Parameters:
fqn -

nodeVisited

public void nodeVisited(Fqn (src)  fqn)
Description copied from interface: TreeCacheListener (src)
Called when a node is visisted, i.e., get().

Specified by:
nodeVisited in interface TreeCacheListener (src)
Parameters:
fqn -

cacheStarted

public void cacheStarted(TreeCache (src)  cache)
Description copied from interface: TreeCacheListener (src)
Called when the cache is started.

Specified by:
cacheStarted in interface TreeCacheListener (src)
Parameters:
cache -

cacheStopped

public void cacheStopped(TreeCache (src)  cache)
Description copied from interface: TreeCacheListener (src)
Called when the cache is stopped.

Specified by:
cacheStopped in interface TreeCacheListener (src)
Parameters:
cache -

viewChange

public void viewChange(View new_view)
Specified by:
viewChange in interface TreeCacheListener (src)

setConfig

public void setConfig(java.util.Properties props)
Description copied from interface: CacheLoader (src)
Sets the configuration. Will be called before Service.create() and Service.start()

Specified by:
setConfig in interface CacheLoader (src)
Parameters:
props - A list of properties, defined in the XML file

setCache

public void setCache(TreeCache (src)  c)
Description copied from interface: CacheLoader (src)
This method allows the CacheLoader to set the TreeCache, therefore allowing the CacheLoader to invoke methods of the TreeCache. It can also use the TreeCache to fetch configuration information. Alternatively, the CacheLoader could maintain its own configuration
This method will be called directly after the CacheLoader instance has been created

Specified by:
setCache in interface CacheLoader (src)
Parameters:
c - The cache on which this loader works

getChildrenNames

public java.util.Set getChildrenNames(Fqn (src)  fqn)
                               throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Returns a list of children names, all names are relative. Returns null if the parent node is not found. The returned set must not be modified, e.g. use Collections.unmodifiableSet(s) to return the result

Specified by:
getChildrenNames in interface CacheLoader (src)
Parameters:
fqn - The FQN of the parent
Returns:
Set. A list of children. Returns null if no children nodes are present, or the parent is not present
Throws:
java.lang.Exception

get

public java.lang.Object get(Fqn (src)  name,
                            java.lang.Object key)
                     throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Returns the value for a given key. Returns null if the node doesn't exist, or the value is not bound

Specified by:
get in interface CacheLoader (src)
Parameters:
name -
Returns:
Throws:
java.lang.Exception

get

public java.util.Map get(Fqn (src)  name)
                  throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Returns all keys and values from the persistent store, given a fully qualified name

Specified by:
get in interface CacheLoader (src)
Parameters:
name -
Returns:
Map of keys and values for the given node. Returns null if the node was not found, or if the node has no attributes
Throws:
java.lang.Exception

exists

public boolean exists(Fqn (src)  name)
               throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Checks whether the CacheLoader has a node with Fqn

Specified by:
exists in interface CacheLoader (src)
Parameters:
name -
Returns:
True if node exists, false otherwise
Throws:
java.lang.Exception

put

public java.lang.Object put(Fqn (src)  name,
                            java.lang.Object key,
                            java.lang.Object value)
                     throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Inserts key and value into the attributes hashmap of the given node. If the node does not exist, all parent nodes from the root down are created automatically. Returns the old value

Specified by:
put in interface CacheLoader (src)
Throws:
java.lang.Exception

put

public void put(Fqn (src)  name,
                java.util.Map attributes)
         throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Inserts all elements of attributes into the attributes hashmap of the given node, overwriting existing attributes, but not clearing the existing hashmap before insertion (making it a union of existing and new attributes) If the node does not exist, all parent nodes from the root down are created automatically

Specified by:
put in interface CacheLoader (src)
Parameters:
name - The fully qualified name of the node
attributes - A Map of attributes. Can be null
Throws:
java.lang.Exception

put

public void put(java.util.List modifications)
         throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Inserts all modifications to the backend store. Overwrite whatever is already in the datastore.

Specified by:
put in interface CacheLoader (src)
Parameters:
modifications - A List of modifications
Throws:
java.lang.Exception

remove

public java.lang.Object remove(Fqn (src)  name,
                               java.lang.Object key)
                        throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Removes the given key and value from the attributes of the given node. No-op if node doesn't exist

Specified by:
remove in interface CacheLoader (src)
Throws:
java.lang.Exception

remove

public void remove(Fqn (src)  name)
            throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Removes the given node. If the node is the root of a subtree, this will recursively remove all subnodes, depth-first

Specified by:
remove in interface CacheLoader (src)
Throws:
java.lang.Exception

removeData

public void removeData(Fqn (src)  name)
                throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Removes all attributes from a given node, but doesn't delete the node itself

Specified by:
removeData in interface CacheLoader (src)
Parameters:
name -
Throws:
java.lang.Exception

prepare

public void prepare(java.lang.Object tx,
                    java.util.List modifications,
                    boolean one_phase)
             throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Prepare the modifications. For example, for a DB-based CacheLoader:
  1. Create a local (JDBC) transaction
  2. Associate the local transaction with tx (tx is the key)
  3. Execute the coresponding SQL statements against the DB (statements derived from modifications)
For non-transactional CacheLoader (e.g. file-based), this could be a null operation

Specified by:
prepare in interface CacheLoader (src)
Parameters:
tx - The transaction, just used as a hashmap key
modifications - List, a list of all modifications within the given transaction
one_phase - Persist immediately and (for example) commit the local JDBC transaction as well. When true, we won't get a CacheLoader.commit(Object) or CacheLoader.rollback(Object) method call later
Throws:
java.lang.Exception

commit

public void commit(java.lang.Object tx)
            throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Commit the transaction. A DB-based CacheLoader would look up the local JDBC transaction asociated with tx and commit that transaction
Non-transactional CacheLoaders could simply write the data that was previously saved transiently under the given tx key, to (for example) a file system (note this only holds if the previous prepare() did not define one_phase=true

Specified by:
commit in interface CacheLoader (src)
Parameters:
tx -
Throws:
java.lang.Exception

rollback

public void rollback(java.lang.Object tx)
Description copied from interface: CacheLoader (src)
Roll the transaction back. A DB-based CacheLoader would look up the local JDBC transaction asociated with tx and roll back that transaction

Specified by:
rollback in interface CacheLoader (src)
Parameters:
tx -

loadEntireState

public byte[] loadEntireState()
                       throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Fetch the entire state for this cache from secondary storage (disk, DB) and return it as a byte buffer. This is for initialization of a new cache from a remote cache. The new cache would then call storeEntireState().
todo: define binary format for exchanging state

Specified by:
loadEntireState in interface CacheLoader (src)
Throws:
java.lang.Exception

storeEntireState

public void storeEntireState(byte[] state)
                      throws java.lang.Exception
Description copied from interface: CacheLoader (src)
Store the given state in secondary storage. Overwrite whatever is currently in seconday storage.

Specified by:
storeEntireState in interface CacheLoader (src)
Throws:
java.lang.Exception

create

public void create()
            throws java.lang.Exception
Description copied from interface: Service (src)
create the service, do expensive operations etc

Specified by:
create in interface Service (src)
Throws:
java.lang.Exception

start

public void start()
           throws java.lang.Exception
Description copied from interface: Service (src)
start the service, create is already called

Specified by:
start in interface Service (src)
Throws:
java.lang.Exception

stop

public void stop()
Description copied from interface: Service (src)
stop the service

Specified by:
stop in interface Service (src)

destroy

public void destroy()
Description copied from interface: Service (src)
destroy the service, tear down

Specified by:
destroy in interface Service (src)