Great thanks :) On Wed, Aug 17, 2016 at 10:10 AM, Fabian Pichler <[email protected]> wrote: > 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
-- Thomas Mortagne _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

