Thank you Thomas for your explanations. You are completely right, you wrote it in the first mail. The generation of the cache key is broken. I added now XWIKI-13632 for this.
If it is ok, I start preparing a PullRequest for XWIKI-13632 and then a second one for XWIKI-13623. Kind regards, Fabian 2016-08-10 16:33 GMT+02:00 Thomas Mortagne <[email protected]>: > On Wed, Aug 10, 2016 at 12:41 PM, Fabian Pichler > <[email protected]> wrote: > > ok, if I understand correctly the API contract so far is, that the > context > > defines the database used and the reference of the document to load > > must only be taken relative to the given context. (old String fullName > > and context-database interpretation). > > Yes. > > > > > So, I think it would be better to compute the lookup key based on the > > context database and the fullName computed out of the document reference. > > Otherwise you would not get the same document in both situations. > > 1. from cache > > 2. freshly loaded > > Yes this what I explained. > > > > > Anyway, I am not sure if it is a good idea to fix the key-issue as part > of > > XWIKI-13623. I think that XWIKI-13623 should only focus on the mentioned > > memory visability and resulting data loss issue. > > I did not told you to do it as part of XWIKI-13623 but you cannot do > XWIKI-13623 without cleaning a bit the way cache key is handled right > now in the method since from what I understood you depend on a proper > cache key (to access the right DocumentLoader) in the solution you > proposed. > > > > > Fabian. > > > > 2016-08-10 10:52 GMT+02:00 Thomas Mortagne <[email protected]>: > > > >> On Wed, Aug 10, 2016 at 10:14 AM, Fabian Pichler > >> <[email protected]> wrote: > >> > Hi Thomas > >> > > >> > Thanks for responding and thanks for supporting the suggested > solution. > >> > > >> > I understand the doc.Key-issue that you mentioned. Yet, I think this > is > >> not > >> > a > >> > XWikiCacheStore#loadXWikDoc concern. In my understanding the expected > >> > document > >> > to load is defined by the document-reference and the language. Thus > the > >> > Hibernate-Store must be concerned in setting the context database > >> according > >> > to the Wiki-Reference before loading the document. This is acctually > >> already > >> > done in the XWiki#getDocument call. I agree that this might be the > wrong > >> > place to do it. > >> > Thus, I would suggest to fix this issue in the XWikiHibernateStore on > a > >> > seperate jira-issue. > >> > >> In an ideal world it would be fixed in XWikiHibernateStore I agree but > >> this would break retro compatibility (yeah always a pain). That's why > >> I talked about providing a new API. > >> > >> So right now in practice using a combination of context wiki and > >> document reference is part of the API definition and can be applied at > >> XWikiCacheStore too. > >> > >> Note that in practice this is actually a pretty rare case since anyone > >> is supposed to use XWiki#getDocument which make sure the context > >> contain the document wiki. But this can still happen since this is a > >> very old and public API. > >> > >> > Maybe this could be combined with a significant performance > improvment in > >> > loading > >> > the documents with fewer sql-queries per loading action. > >> > > >> > With XWIKI-13623 I try to tackle the issue about randomly loosing > >> BaseObject > >> > data because of an not thread safe construction and publication of > >> > XWikiDocument > >> > java objects in XWikiCacheStore. Because this issue gave us a big > >> headache > >> > in > >> > production multiple times, I solved it in our project in the way > >> mentioned. > >> > > >> > If the xwiki-dev team supports the suggested solution, I would be > willing > >> > to proceed > >> > and prepare a pull request for an adapted XWikiCacheStore fix. > >> > > >> > Kind regards, > >> > Fabian > >> > > >> > > >> > 2016-08-08 12:07 GMT+02:00 Thomas Mortagne <[email protected] > >: > >> > > >> >> XWikiCacheStore#loadXWikiDoc is actually a bit tricker than that > right > >> >> now for retro compatibility and laziness (really need to rewrite this > >> >> whole store API) reasons and before applying what you propose the way > >> >> it deals with document uid should be modified a bit. > >> >> > >> >> Hibernate store is always loading the document from the wiki > indicated > >> >> in the context completely ignoring the wiki in the XWikiDocument > >> >> object. That means that doc.getKey() may be different than the key of > >> >> the document that will actually come from the hibernate store. So > >> >> before adding DocumentLoader jingling a first thing to do is generate > >> >> the initial cache key with a mix of the wiki id located in the > context > >> >> and the XWikiDocument reference. > >> >> > >> >> Then what you propose sounds good. > >> >> > >> >> On Mon, Aug 8, 2016 at 8:53 AM, Fabian Pichler > >> >> <[email protected]> wrote: > >> >> > Hi devs > >> >> > > >> >> > http://jira.xwiki.org/browse/XWIKI-13623 > >> >> > I would like to discuss the suggested solution, before I start > >> >> implementing > >> >> > it: > >> >> > > >> >> > *I suggest the following solution:* > >> >> > Introducing a nested DocumentLoader class which loads the document > >> >> calling > >> >> > the basestore loadXWikiDoc in a synchronized getDocOrLoad method. > The > >> >> > DocumentLoader objects gets instantiated in the cacheStore on a > cache > >> >> miss. > >> >> > It then gets stored in a ConcurrentHashMap using the same key > which is > >> >> used > >> >> > for the document cache (DocumentReference including language). > Using > >> >> > putIfAbsent to insert the DocumentLoader and calling the > synchronized > >> >> load > >> >> > method on the object in the map solves the memory visibility issue > and > >> >> > moreover ensures that the same XWikiDocument is not loaded multiple > >> times > >> >> > concurrently from the database. It is still possible to load > different > >> >> > documents in parallel. A DocumentLoader will load the XWikiDocument > >> only > >> >> > once and the returns the identical document object on any following > >> call > >> >> of > >> >> > the synchronized getDocOrLoad method. > >> >> > > >> >> > WDYT? > >> >> > > >> >> > Kind Regards, > >> >> > Fabian > >> >> > _______________________________________________ > >> >> > devs mailing list > >> >> > [email protected] > >> >> > http://lists.xwiki.org/mailman/listinfo/devs > >> >> > >> >> > >> >> > >> >> -- > >> >> Thomas Mortagne > >> >> _______________________________________________ > >> >> devs mailing list > >> >> [email protected] > >> >> http://lists.xwiki.org/mailman/listinfo/devs > >> >> > >> > _______________________________________________ > >> > devs mailing list > >> > [email protected] > >> > http://lists.xwiki.org/mailman/listinfo/devs > >> > >> > >> > >> -- > >> Thomas Mortagne > >> _______________________________________________ > >> devs mailing list > >> [email protected] > >> http://lists.xwiki.org/mailman/listinfo/devs > >> > > _______________________________________________ > > devs mailing list > > [email protected] > > http://lists.xwiki.org/mailman/listinfo/devs > > > > -- > Thomas Mortagne > _______________________________________________ > devs mailing list > [email protected] > http://lists.xwiki.org/mailman/listinfo/devs > _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

