Hi Ian, Finally was able to fix ;-). Had to debug along with the path and fix some other issues also in Cassandra Provider impl. I have updated the JIRA with the new reports of CUD. (I ran them one after the other respectively)
In brief as follows. CREATE Average Latency Under Node LA = 165 (ms) Average Latency Under Node MA = 203 (ms) Average Latency Under Node SA = 256 (ms) #TOTAL CALLS = 300 Total Average Latency = 208 (ms) UPDATE Average Latency Under Node LA = 36 (ms) Average Latency Under Node MA = 29 (ms) Average Latency Under Node SA = 25 (ms) #TOTAL CALLS = 300 Total Average Latency = 30 (ms) DELETE Average Latency Under Node LA = 20 (ms) Average Latency Under Node MA = 19 (ms) Average Latency Under Node SA = 19 (ms) #TOTAL CALLS = 300 Total Average Latency = 19 (ms) On Mon, Sep 9, 2013 at 5:47 PM, Ian Boston <i...@tfd.co.uk> wrote: > Hi > The CassandraImpl needs to return something suitable to represent > > /content/cassandra/p > > For the moment, if the column family p does exist, return a new type > of read only resource, eg CassandraColumnFamilyResource. > > Ian > > > On 9 September 2013 13:02, Dishara Wijewardana <ddwijeward...@gmail.com> > wrote: > > On Mon, Sep 9, 2013 at 2:09 PM, Ian Boston <i...@tfd.co.uk> wrote: > > > >> Hi, > >> The call to processCreate a few lines earlier should have created the > >> resource so that the subsequent call to getResource returned the new > >> resource into newResource. > >> > >> If you look through the calls the create operation is called in > >> > >> > >> > org.apache.sling.servlets.post.impl.operations.AbstractCreateOperation.deepGetOrCreateNode(ResourceResolver, > >> String, Map<String, RequestProperty>, List<Modification>, > >> VersioningConfiguration) > >> > >> Line 533 > >> > >> resource = resolver.create(resource, name, props); > >> > >> Stick a breakpoint at that line and see, if its called, and if the > >> resource resolver calls your code. > >> > >> > >> > > Hi Ian, > > Yes it calls the create method. As I see the issue is the commit not > > getting called and hence resolver cannot get the created resource. > > So I thought of commit on the fly @create method to verify that. But we > > have a problem here. > > > > When I try to create /content/cassandra/p/c node, as you exactly > mentioned > > before, it tries to create /content/cassandra/p node. In Cassandra > Impl, > > there cannot be a node like /content/cassandra/p and hence returns NULL > as > > earlier and still create fails. Because "p" is the column family (the > model > > which we agreed and implemented). So what is the best approach to > overcome > > this. > > > > > > > >> BTW: Its Ok that there is a newResource.adaptTo(Node.class) as the > >> result is checked for Null a moment later. You do not need to support > >> adaptTo(Node.class), which is a special case for Jcr. > >> > >> Best Regards > >> Ian > >> > >> On 9 September 2013 06:05, Dishara Wijewardana <ddwijeward...@gmail.com > > > >> wrote: > >> > Hi Ian, > >> > I debug the servlet from line to line and locate the NPE that causes > this > >> > failure. The request path > >> > > >> > SlingPostServlet > AbstractCreateOperation > ModifyOperation@line 105 > >> > where newResource = null. The resource resolver at this point > >> > is org.apache.sling.resourceresolver.impl.ResourceResolverImpl. > >> > > >> > 104 final Resource newResource = > >> > request.getResourceResolver().getResource(response.getPath()); > >> > 105 final Node newNode = *newResource*.adaptTo(Node.class); > >> > > >> > The resolver get a resource if the resource is already existing > >> > one(obviously). So either this should be a bug or my request goes > through > >> > the wrong path. Please advice. > >> > > >> > > >> > > >> > > >> > On Mon, Sep 9, 2013 at 8:45 AM, Dishara Wijewardana < > >> ddwijeward...@gmail.com > >> >> wrote: > >> > > >> >> I also checked in Cassandra Provider impl and with system logs and > >> >> verified the Error not comes due to exception throws from the > Provider > >> >> implementation itself. > >> >> So probably it will be a missing a property. I still could not figure > >> out > >> >> which. If I can find which servlet get called I can debug and > >> see(already > >> >> post a mail to dev list). > >> >> > >> >> > >> >> On Sun, Sep 8, 2013 at 5:10 AM, Dishara Wijewardana < > >> >> ddwijeward...@gmail.com> wrote: > >> >> > >> >>> Hi Ian, > >> >>> I found it difficult to use createNode method to work. It returns > 200 > >> >>> response. I was trying to get this working but could not find a way. > >> >>> Probably I might be missing some properties. What I set was only > >> content > >> >>> type to be json. What are the appropriate properties that you > >> mentioned. > >> >>> How can someone get to know what are the properties required > minimum to > >> >>> create a node. I debug and verified my create method gets hit in > >> provider > >> >>> side. > >> >>> > >> >>> *P.S If I give a already existing path it works and gives 302 > >> response. * > >> >>> i.e /content/cassandra/p1/c1 this works since it is already there. > >> >>> But /content/cassandra/pp/cc fails. I also tried > >> >>> adding /content/cassandra/pp first and then > /content/cassandra/pp/cc. > >> It > >> >>> fails at /content/cassandra/pp. > >> >>> > >> >>> Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: > 36.21 > >> sec > >> >>> <<< FAILURE! > >> >>> > >> > testResourceCreate(org.apache.sling.launchpad.webapp.integrationtest.resourceprovider.CassandraResourceCUDTest) > >> >>> Time elapsed: 36.187 sec <<< ERROR! > >> >>> > org.apache.sling.commons.testing.integration.HttpStatusCodeException: > >> >>> Expected status code 302 for POST, got 200, URL= > >> >>> http://localhost:8080/content/cassandra/pp/cc, Content=[<html> > >> >>> <head> > >> >>> <title>Error while processing /content/cassandra/pp/cc</title> > >> >>> </head> > >> >>> <body> > >> >>> <h1>Error while processing /content/cassandra/pp/cc</h1> > >> >>> <table> > >> >>> <tbody> > >> >>> <tr> > >> >>> <td>Status</td> > >> >>> <td><div id="Status">500</div></td> > >> >>> </tr> > >> >>> <tr> > >> >>> <td>Message</td> > >> >>> <td><div > >> >>> id="Message">java.lang.NullPointerException</div></td> > >> >>> </tr> > >> >>> <tr> > >> >>> <td>Location</td> > >> >>> <td><a href="/cassandra/pp/cc" > >> >>> id="Location">/cassandra/pp/cc</a></td> > >> >>> </tr> > >> >>> <tr> > >> >>> <td>Parent Location</td> > >> >>> <td><a href="/cassandra/pp" > >> >>> id="ParentLocation">/cassandra/pp</a></td> > >> >>> </tr> > >> >>> <tr> > >> >>> <td>Path</td> > >> >>> <td><div > id="Path">/content/cassandra/pp/cc</div></td> > >> >>> </tr> > >> >>> <tr> > >> >>> <td>Referer</td> > >> >>> <td><a href="" id="Referer"></a></td> > >> >>> </tr> > >> >>> <tr> > >> >>> <td>ChangeLog</td> > >> >>> <td><div > >> id="ChangeLog"><pre></pre></div></td> > >> >>> </tr> > >> >>> </tbody> > >> >>> </table> > >> >>> <p><a href="">Go Back</a></p> > >> >>> <p><a href="/cassandra/pp/cc">Modified Resource</a></p> > >> >>> <p><a href="/cassandra/pp">Parent of Modified Resource</a></p> > >> >>> </body> > >> >>> </html>] > >> >>> at > >> >>> > >> > org.apache.sling.commons.testing.integration.SlingIntegrationTestClient.createNode(SlingIntegrationTestClient.java:188) > >> >>> at > >> >>> > >> > org.apache.sling.commons.testing.integration.SlingIntegrationTestClient.createNode(SlingIntegrationTestClient.java:119) > >> >>> at > >> >>> > >> > org.apache.sling.commons.testing.integration.SlingIntegrationTestClient.createNode(SlingIntegrationTestClient.java:109) > >> >>> at > >> >>> > >> > org.apache.sling.launchpad.webapp.integrationtest.resourceprovider.CassandraResourceCUDTest.testResourceCreate(CassandraResourceCUDTest.java:29) > >> >>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > >> >>> at > >> >>> > >> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > >> >>> at > >> >>> > >> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > >> >>> at java.lang.reflect.Method.invoke(Method.java:597) > >> >>> at junit.framework.TestCase.runTest(TestCase.java:168) > >> >>> at junit.framework.TestCase.runBare(TestCase.java:134) > >> >>> at junit.framework.TestResult$1.protect(TestResult.java:110) > >> >>> at junit.framework.TestResult.runProtected(TestResult.java:128) > >> >>> at junit.framework.TestResult.run(TestResult.java:113) > >> >>> at junit.framework.TestCase.run(TestCase.java:124) > >> >>> at junit.framework.TestSuite.runTest(TestSuite.java:232) > >> >>> at junit.framework.TestSuite.run(TestSuite.java:227) > >> >>> at > >> >>> > >> > org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:81) > >> >>> at > >> >>> > >> > org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) > >> >>> at > >> >>> > >> > org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) > >> >>> at > >> >>> > >> > org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) > >> >>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > >> >>> at > >> >>> > >> > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > >> >>> at > >> >>> > >> > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > >> >>> at java.lang.reflect.Method.invoke(Method.java:597) > >> >>> at > >> >>> > >> > org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) > >> >>> at > >> >>> > >> > org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) > >> >>> at > >> >>> > >> > org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) > >> >>> at > >> >>> > >> > org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) > >> >>> at > >> >>> > >> org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) > >> >>> > >> >>> > >> >>> Results : > >> >>> > >> >>> Tests in error: > >> >>> > >> >>> > >> > testResourceCreate(org.apache.sling.launchpad.webapp.integrationtest.resourceprovider.CassandraResourceCUDTest): > >> >>> Expected status code 302 for POST, got 200, URL= > >> >>> http://localhost:8080/content/cassandra/pp/cc, Content=[<html>(..) > >> >>> > >> >>> Tests run: 1, Failures: 0, Errors: 1, Skipped: 0 > >> >>> > >> >>> [INFO] > >> >>> > >> ------------------------------------------------------------------------ > >> >>> [INFO] BUILD FAILURE > >> >>> [INFO] > >> >>> > >> ------------------------------------------------------------------------ > >> >>> [INFO] Total time: 40.126s > >> >>> [INFO] Finished at: Sun Sep 08 05:05:47 IST 2013 > >> >>> [INFO] Final Memory: 13M/490M > >> >>> > >> >>> > >> >>> > >> >>> > >> >>> On Fri, Sep 6, 2013 at 1:23 PM, Ian Boston <i...@tfd.co.uk> wrote: > >> >>> > >> >>>> Hi, > >> >>>> Thanks, now I see how you're doing it. Its good. > >> >>>> > >> >>>> So to do a Write (CUD[1]) test, create another class that extends > >> >>>> HttpBaseTest and write a test method that invokes > >> >>>> > >> >>>> testClient.createNode(...) with an appropriate set of properties > and a > >> >>>> collection managed by the CassandraProvider. You will probably > need to > >> >>>> create that collection first, and its parent, or better still, > reuse > >> >>>> the existing pre-populated collections since we are looking for the > >> >>>> scalability of CUD relative to collection size. > >> >>>> > >> >>>> I think if you use createNode on an existing node it will update > it, > >> >>>> and there is a delete method as well. > >> >>>> > >> >>>> testClient is a > >> >>>> > >> org.apache.sling.commons.testing.integration.SlingIntegrationTestClient > >> >>>> and is protected in HttpBaseTest so you should have access. > >> >>>> > >> >>>> As I said, perform CUD on 100 new nodes in each collection and > print > >> >>>> the results out. > >> >>>> > >> >>>> Obviously add all new code to you repository so its all in one > place. > >> >>>> > >> >>>> Best Regards > >> >>>> Ian > >> >>>> > >> >>>> 1 Create Update Delete (you've done read, we need stats for each of > >> >>>> these operations) > >> >>>> > >> >>>> > >> >>>> On 6 September 2013 04:31, Dishara Wijewardana < > >> ddwijeward...@gmail.com> > >> >>>> wrote: > >> >>>> > Hi Ian, > >> >>>> > Done. > >> >>>> > > >> >>>> > > >> >>>> > On Thu, Sep 5, 2013 at 10:53 AM, Ian Boston <i...@tfd.co.uk> > wrote: > >> >>>> > > >> >>>> >> Hi Dishara, > >> >>>> >> > >> >>>> >> On Thursday, September 5, 2013, Dishara Wijewardana wrote: > >> >>>> >> > >> >>>> >> > Hi Ian, > >> >>>> >> > Did you mean the sling integration test (which runs the > >> performance > >> >>>> tests > >> >>>> >> > and provides reports) to move inside google code repo ? > >> >>>> >> > >> >>>> >> > >> >>>> >> Yes please. > >> >>>> >> Thanks > >> >>>> >> > >> >>>> >> Best regards > >> >>>> >> Ian > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> > > >> >>>> >> > > >> >>>> >> > On Wed, Sep 4, 2013 at 5:41 PM, Ian Boston <i...@tfd.co.uk> > >> wrote: > >> >>>> >> > > >> >>>> >> > > On 4 September 2013 13:42, Dishara Wijewardana < > >> >>>> >> ddwijeward...@gmail.com> > >> >>>> >> > > wrote: > >> >>>> >> > > > HI Ian, > >> >>>> >> > > > > >> >>>> >> > > > > >> >>>> >> > > > > >> >>>> >> > > > On Wed, Sep 4, 2013 at 4:00 PM, Ian Boston <i...@tfd.co.uk > > > >> >>>> wrote: > >> >>>> >> > > > > >> >>>> >> > > >> On 4 September 2013 12:20, Dishara Wijewardana < > >> >>>> >> > ddwijeward...@gmail.com > >> >>>> >> > > > > >> >>>> >> > > >> wrote: > >> >>>> >> > > >> <snip> > >> >>>> >> > > >> > >> >>>> >> > > >> >> How long does it take to add, update and delete, 100 > new > >> >>>> items to > >> >>>> >> > the > >> >>>> >> > > >> >> existing collections that you used for the read > tests. If > >> >>>> its > >> >>>> >> > quick, > >> >>>> >> > > you > >> >>>> >> > > >> >> may need to make that 1000 new items. > >> >>>> >> > > >> >> > >> >>>> >> > > >> >> > >> >>>> >> > > >> > Hi Ian, > >> >>>> >> > > >> > > >> >>>> >> > > >> > In the modify provider interface there is no "update" > >> >>>> method. Am I > >> >>>> >> > > >> missing > >> >>>> >> > > >> > something? > >> >>>> >> > > >> > >> >>>> >> > > >> You need to support adapTo(ModifyableValueMap.class) > IIRC. > >> >>>> >> > > >> > >> >>>> >> > > > I saw the interface ModifyableValueMap, but could not > find a > >> >>>> clear > >> >>>> >> > > example > >> >>>> >> > > > usage of it as in PlanetResource case. But will see > further. > >> >>>> >> > > > > >> >>>> >> > > > >> >>>> >> > > IIRC the MongoDB ResourceProvider allows modification. grep > the > >> >>>> Sling > >> >>>> >> > > source code for it. > >> >>>> >> > > > >> >>>> >> > > > >> >>>> >> > > >> > >> >>>> >> > > >> > > >> >>>> >> > > >> > Can you please elaborate more on exact scope and goals > on > >> >>>> what is > >> >>>> >> > > >> expected > >> >>>> >> > > >> > from the new performance test class?Is it to capture > the > >> >>>> >> add/delete > >> >>>> >> > > >> latency > >> >>>> >> > > >> > on nodes added in each collection. > >> >>>> >> > > >> > >> >>>> >> > > >> yes. > >> >>>> >> > > >> > >> >>>> >> > > >> > > >> >>>> >> > > >> > If so, is it possible to test add/delete extending > >> HTTPBase > >> >>>> test > >> >>>> >> as > >> >>>> >> > > done > >> >>>> >> > > >> > for reading ? Or any other class that provides abstract > >> test > >> >>>> >> class/ > >> >>>> >> > > APIs > >> >>>> >> > > >> to > >> >>>> >> > > >> > add/delete ? > >> >>>> >> > > >> > > >> >>>> >> > > >> > >> >>>> >> > > >> Where are the classes that you used to perform the read > >> tests, > >> >>>> I > >> >>>> >> cant > >> >>>> >> > > >> see them in the repo ? > >> >>>> >> > > >> > >> >>>> >> > > >> The class that I used was > >> >>>> >> > > > org.apache.sling.commons.testing.integration.HttpTestBase > . I > >> >>>> have > >> >>>> >> > > attached > >> >>>> >> > > > the patch of my class which extends this class. There I am > >> usinf > >> >>>> >> > > > getContent() method of the base class to do HTTP get > content > >> >>>> >> > operations. > >> >>>> >> > > > >> >>>> >> > > > >> >>>> >> > > Could we get your test classes to run the load test into > your > >> >>>> >> > > repository please, even if its something that has to be run > >> >>>> manually. > >> >>>> >> > > > >> >>>> >> > > Thanks > >> >>>> >> > > > >> >>>> >> > > > >> >>>> >> > > Best Regards > >> >>>> >> > > Ian > >> >>>> >> > > > >> >>>> >> > > > >> >>>> >> > > > > >> >>>> >> > > >> Ian > >> >>>> >> > > >> > >> >>>> >> > > >> > >> >>>> >> > > >> > >> >>>> >> > > >> > > >> >>>> >> > > >> > > >> >>>> >> > > >> >> Best regards > >> >>>> >> > > >> >> Ian > >> >>>> >> > > >> >> > >> >>>> >> > > >> >> > >> >>>> >> > > >> >> > >> >>>> >> > > >> >> > >> >>>> >> > > >> >> > >> >>>> >> > > >> >> > > >> >>>> >> > > >> >> > > >> >>>> >> > > >> >> > > Best Regards > >> >>>> >> > > >> >> > > Ian > >> >>>> >> > > >> >> > > > >> >>>> >> > > >> >> > > On 3 September 2013 01:23, Dishara Wijewardana < > >> >>>> >> > > >> >> ddwijeward...@gmail.com<javascript:;> > >> >>>> >> > > >> >> > > > >> >>>> >> > > >> >> > > wrote: > >> >>>> >> > > >> >> > > > Hi Ian, > >> >>>> >> > > >> >> > > > Thank you for the references. I just commited > the > >> >>>> changes. > >> >>>> >> > > There I > >> >>>> >> > > >> >> have > >> >>>> >> > > >> >> > > > completed the whole implementation of > >> >>>> >> > ModifyingResourceProvider > >> >>>> >> > > >> >> > interface > >> >>>> >> > > >> >> > > > for Cassandra Resource Provider (create, > delete, > >> >>>> commit , > >> >>>> >> > > >> rollback > >> >>>> >> > > >> >> > etc) > >> >>>> >> > > >> >> > > > and wrote 3 test classes ( > >> >>>> >> > > >> CassandraModifyResourceProvide**rAddTest, > >> >>>> >> > > >> >> > > Cassan > >> >>>> >> > > >> >> > > > draModif-- > >> >>>> >> > Thanks > >> >>>> >> > /Dishara > >> >>>> >> > > >> >>>> >> > >> >>>> > > >> >>>> > > >> >>>> > > >> >>>> > -- > >> >>>> > Thanks > >> >>>> > /Dishara > >> >>>> > >> >>> > >> >>> > >> >>> > >> >>> -- > >> >>> Thanks > >> >>> /Dishara > >> >>> > >> >> > >> >> > >> >> > >> >> -- > >> >> Thanks > >> >> /Dishara > >> >> > >> > > >> > > >> > > >> > -- > >> > Thanks > >> > /Dishara > >> > > > > > > > > -- > > Thanks > > /Dishara > -- Thanks /Dishara