Skip to content

RowBatcher thread throws NPE on console when plan with bind params used #1249

@georgeajit

Description

@georgeajit

Version of MarkLogic Java Client API

develop branch (after 5.2.0 release)

Version of MarkLogic Server

10.0 nightly build

Java version

Open JDK 9

OS and version

IntelliJ IDE Windows

Input: Some code to illustrate the problem, preferably in a state that can be independently reproduced on our end

Using QA's functional test project's optic API data files (TDE and docs) as input, this test configures a RowBatcher with 2 threads and batch size of 1. The results of the Plan is 6 rows.
Plan has a bind parameter named ID.

        StringBuilder failedBuf = null;
        StringBuilder successBuf = null;

        RowBatcher<JsonNode> rowsBatcherOfJsonObj = dmManager.newRowBatcher(new JacksonHandle())
                .withBatchSize(3)
                .withThreadCount(2)
                .withJobName("Export As Rows of JsonNodes");
        RowManager rowMgr = rowsBatcherOfJsonObj.getRowManager();
        rowMgr.setDatatypeStyle(RowManager.RowSetPart.HEADER);
        PlanBuilder p = rowMgr.newPlanBuilder();
        PlanBuilder.ModifyPlan plan1 = p.fromView("opticFunctionalTest", "detail")
                .orderBy(p.schemaCol("opticFunctionalTest", "detail", "id"));
        PlanBuilder.ModifyPlan plan2 = p.fromView("opticFunctionalTest", "master")
                .orderBy(p.schemaCol("opticFunctionalTest", "master", "id"));
        PlanParamExpr idParam = p.param("ID");
        PlanBuilder.ModifyPlan plan3 = plan1.joinInner(plan2)
                .where(
                        p.eq(p.schemaCol("opticFunctionalTest", "master", "id"), idParam)
                )
                .orderBy(p.asc(p.schemaCol("opticFunctionalTest", "detail", "id")));
        JacksonHandle jacksonHandle = new JacksonHandle();
        jacksonHandle.setMimetype("application/json");

        plan3.bindParam("ID", 1);
        rowsBatcherOfJsonObj.withBatchView(plan3);
        ArrayList<Double> exptdAmt = new ArrayList(Arrays.asList(10.01,20.02,30.03,40.04,50.05,60.06));
        ArrayList<Double> resultAmt = new ArrayList<>();

        rowsBatcherOfJsonObj.onSuccess(e ->{
            JsonNode resDoc = e.getRowsDoc().get("rows");

            if (resDoc == null)
                failedBuf.append("No rows returned in batch from " + e.getLowerBound() + "to" + e.getUpperBound());
            else {
                for (int i=0; i<resDoc.size(); i++) {
                    //System.out.println("Thread id : " + Thread.currentThread().getId() + " is named as " + Thread.currentThread().getName());
                    System.out.println("row : "+ resDoc.get(i).get("opticFunctionalTest.detail.amount").asText());
                    resultAmt.add(resDoc.get(i).get("opticFunctionalTest.detail.amount").asDouble());
                }
            }
        })
                .onFailure((fevt, mythrows)-> {
                            failedBuf.append("Batch Failures in " + fevt.getJobBatchNumber() + "batch from "+ fevt.getLowerBound() + "to" + fevt.getUpperBound());
                        }
                );
        dmManager.startJob(rowsBatcherOfJsonObj);
        rowsBatcherOfJsonObj.awaitCompletion();
        for (Double d : resultAmt) {
            assertTrue(exptdAmt.contains(d.doubleValue()));

Actual output: What did you observe? What errors did you see? Can you attach the logs? (Java logs, MarkLogic logs)

In the IDE console we have:

In testRowBatcherWithBind method
23:01:23.547 [Test worker] INFO  c.m.c.d.impl.RowBatcherImpl - (withForestConfig) Using forests on [localhost] hosts for "RowBatcherFuncDB"
23:01:23.549 [Test worker] INFO  c.m.c.d.impl.RowBatcherImpl - Adding DatabaseClient on port 8011 for host "localhost" to the rotation
23:01:23.757 [Test worker] INFO  c.m.c.d.impl.RowBatcherImpl - plan analysis schema name: opticFunctionalTest, view name: detail, row estimate: 6
23:01:23.761 [Test worker] INFO  c.m.c.d.impl.RowBatcherImpl - batch count: 7, batch size: 2635249153387078802
23:01:23.764 [pool-2-thread-2] INFO  c.m.c.d.impl.RowBatcherImpl - current batch: 2, lower bound: 2635249153387078802, upper bound: 5270498306774157603
23:01:23.764 [pool-2-thread-1] INFO  c.m.c.d.impl.RowBatcherImpl - current batch: 1, lower bound: 0, upper bound: 2635249153387078801
23:01:24.881 [pool-2-thread-2] INFO  c.m.c.d.impl.RowBatcherImpl - error in failure listener: java.lang.NullPointerException
23:01:24.881 [pool-2-thread-1] INFO  c.m.c.d.impl.RowBatcherImpl - error in failure listener: java.lang.NullPointerException
23:01:24.881 [pool-2-thread-2] INFO  c.m.c.d.impl.RowBatcherImpl - current batch: 3, lower bound: 5270498306774157604, upper bound: 7905747460161236405
23:01:24.881 [pool-2-thread-1] INFO  c.m.c.d.impl.RowBatcherImpl - current batch: 4, lower bound: 7905747460161236406, upper bound: 10540996613548315207
23:01:24.892 [pool-2-thread-2] INFO  c.m.c.d.impl.RowBatcherImpl - error in failure listener: java.lang.NullPointerException
23:01:24.892 [pool-2-thread-1] INFO  c.m.c.d.impl.RowBatcherImpl - error in failure listener: java.lang.NullPointerException
23:01:24.892 [pool-2-thread-2] INFO  c.m.c.d.impl.RowBatcherImpl - current batch: 5, lower bound: 10540996613548315208, upper bound: 13176245766935394009
23:01:24.892 [pool-2-thread-1] INFO  c.m.c.d.impl.RowBatcherImpl - current batch: 6, lower bound: 13176245766935394010, upper bound: 15811494920322472811
23:01:24.901 [pool-2-thread-2] INFO  c.m.c.d.impl.RowBatcherImpl - error in failure listener: java.lang.NullPointerException
23:01:24.901 [pool-2-thread-1] INFO  c.m.c.d.impl.RowBatcherImpl - error in failure listener: java.lang.NullPointerException
23:01:24.901 [pool-2-thread-2] INFO  c.m.c.d.impl.RowBatcherImpl - current batch: 7, lower bound: 15811494920322472812, upper bound: 18446744073709551615
23:01:24.912 [pool-2-thread-2] INFO  c.m.c.d.impl.RowBatcherImpl - error in failure listener: java.lang.NullPointerException
In tearDownAfterClass

Expected output: What specifically did you expect to happen?

6 rows should have been returned. But we see this line in the console output-

INFO  c.m.c.d.impl.RowBatcherImpl - batch count: 7, batch size: 2635249153387078802

### Alternatives: What else have you tried, actual/expected?

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions