DataStoreFactory does not properly support multiple stores
----------------------------------------------------------

                 Key: GORA-105
                 URL: https://issues.apache.org/jira/browse/GORA-105
             Project: Apache Gora
          Issue Type: Bug
          Components: schema, storage
            Reporter: Ferdy Galema
            Priority: Blocker
             Fix For: 0.2


DataStoreFactory has a single, static properties field. This is completely 
unacceptable, because that way when multiple stores are instantiated in the 
same JVM, the last store instance will overwrite the "default.schema" property. 
This causes that all the previous stores will read a misconfigured default 
schema property. Beside this it may cause several other nasty future bugs. In 
my opinion this is a blocker because the methods on DataStoreFactory suggest 
that it can handle multiple stores, when as a matter fact it doesn't. 

I will attach and commit a patch that fixes this problem. It only modifies 
gora-core. All stores directly benefit from this bugfix because of 
DataStoreBase. This patch fixes the following property related problems.

-It introduces a static method createProps in DataStoreFactory. This is the 
equivalent of Configuration.create(). Everyone can create a new properties 
object and set everything interesting on it and pass it on to whatever stores 
they like, instead of ALL stores.
-It fixes the method javadoc of DataStoreBase#getSchemaName(String 
mappingSchemaName, Class<?> persistentClass). The previous description was 
simply wrong.
-It SERIALIZES the properties field of DataStoreBase instead of grabbing the 
static DataStoreFactory.properties field. This has the additional benefit of 
making sure that the store can be used correctly with runtime modified 
properties in a mapreduce context.
-It removes the caching functionality of DataStoreFactory. Because of the 
dynamic configuration in the Properties and Configuration object, it is very 
difficult to implement a correct key hash for the cache. At the moment it only 
uses the triple {datastoreClass, keyClass,valueClass} as a key hash. Multiple 
stores cannot be properly supported when the factory uses badly implemented 
hash keys. (For example, one might instantiate 2 SqlStores, both using the 
exact same {datastoreClass, keyClass,valueClass} triple, but pointing to 
different databases. When one is about the instantiate the second datastore, it 
will faulty return the first datastore from cache). We can always reintroduce 
caching functionality when we can implement a proper key.

The patch passes all tests. Will commit when there are no objections.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to