Hi Roy Do your Site objects reference a resource resolver instance, e.g. via a resource? If they do then it's likely the warning comes from this RR being used concurrently.
Other than that (bar closing the RRs in the thread), I can't see anything obviously wrong with your last code snippet. Regards Julian On Thu, Mar 28, 2019 at 10:01 AM Roy Teeuwen <r...@teeuwen.be> wrote: > > Hey guys, > > Thanks for the replies. > > In the getServiceResourceResolver I do actually call > resourceResolverFactory.getServiceResourceResolver, making it a new resource > resolver instance for every thread. so in my knowledge this does create a new > session, but it's on the same user name? > > Greets, > Roy > > > On 28 Mar 2019, at 08:52, Michael Dürig <mdue...@apache.org> wrote: > > > > > > Hi, > > > > Sorry for missing the original post on the Oak list. > > > > Like Carsten said, sessions do not support multiple threads. See also > > https://docs.adobe.com/docs/en/spec/jcr/2.0/4_Connecting.html > > > > The warning you receive is from a protection mechanism in Oak that prevents > > the worst. I.e. data corruption. However, there are no guarantees beyond > > that. E.g. performance or even progress (no deadlocks). > > > > Michael > > > > > > On 28.03.19 07:32, Carsten Ziegeler wrote: > >> Hi, > >> a resource resolver is single threaded and must not be used concurrently > >> by multiple threads. Main driver (but not the only one) is the JCR session > >> which requires this. > >> However, there is nothing in the Sling code base blocking you from doing > >> so anyways. So we don't have any additional checks like Oak/Jackrabbit > >> has. Therefore the log message you see, is initiated by Oak. I don't want > >> to sent you from one list to another, but to my knowledge your latest code > >> looks ok to me and I'm not aware that you can only have one thread for a > >> service user. But maybe your getServiceResourceResolver method is always > >> returning the same instance and not creating one per call? If not, I fear > >> this is an issue for Oak. > >> Regards > >> Carsten > >> Roy Teeuwen wrote > >>> Hey sling users, > >>> > >>> This is a repost from the userlist of oak because I didn't get a reply > >>> there, so I hope I might get one here: > >>> > >>> > >>> We have a system that migrates our sites based on migration rules, the > >>> psuedocode is as the following: > >>> > >>> resourceResolver = getServiceResourceResolver("migration-user"); > >>> for(Site site in sites) { > >>> migrateSite(resourceResolver) > >>> } > >>> > >>> Everything works fine, but we would like it more performant, so the > >>> change I did was the following: > >>> > >>> resourceResolver = getServiceResourceResolver("migration-user"); > >>> for(Site site in sites) { > >>> threadPool.submit(new Runnable() { run() { > >>> migrateSite(resourceResolver) > >>> }); > >>> } > >>> > >>> This gave the following exception: > >>> > >>> 21.03.2019 11:32:47.244 *WARN* > >>> [sling-threadpool-fb6dc0ad-6c32-47c1-9779-e8acba0ef747-(migration-service)-4] > >>> org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate Attempted to > >>> perform hasProperty while thread > >>> sling-threadpool-fb6dc0ad-6c32-47c1-9779-e8acba0ef747-(migration-service)-2 > >>> was concurrently writing to this session. Blocked until the other thread > >>> finished using this session. Please review your code to avoid concurrent > >>> use of a session. > >>> > >>> So I decided to change the code to the following: > >>> > >>> for(Site site in sites) { > >>> threadPool.submit(new Runnable() { run() { > >>> resourceResolver = getServiceResourceResolver("migration-user"); > >>> migrateSite(resourceResolver) > >>> }); > >>> } > >>> > >>> But it seems that the warn that is being thrown is still being thrown, > >>> does this mean that getting a new service resourceresolver based on the > >>> same user name still get into lockings / synchronizing issues? Is there > >>> any way to solve this? > >>> > >>> Thanks, > >>> Roy > >>> > >> -- > >> Carsten Ziegeler > >> Adobe Research Switzerland > >> cziege...@apache.org >