Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JBatch and Postgresql db as job repository fails #195

Closed
tosuns opened this issue Feb 4, 2015 · 6 comments
Closed

JBatch and Postgresql db as job repository fails #195

tosuns opened this issue Feb 4, 2015 · 6 comments
Assignees

Comments

@tosuns
Copy link

tosuns commented Feb 4, 2015

I'm currently testing payara 4.1.151 with a local postgresql db as job repository, but everytime when my batch-job get executed, I get the following exception:

Warnung: Caught throwable in main execution loop with Throwable message: null, and stack trace: java.lang.NullPointerException
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.updateBatchStatus(BaseStepControllerImpl.java:282)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markStepFailed(BaseStepControllerImpl.java:238)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markJobAndStepFailed(BaseStepControllerImpl.java:243)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.execute(BaseStepControllerImpl.java:128)
at com.ibm.jbatch.container.impl.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:112)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.originateExecutionOnThread(JobThreadRootControllerImpl.java:110)
at com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.enterprise.concurrent.internal.ManagedFutureTask.run(ManagedFutureTask.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)

Warnung: Caught throwable from run(). Stack trace: java.lang.IllegalStateException: Couldn't find entry to update for id = 1
at com.ibm.jbatch.container.services.impl.JobStatusManagerImpl.updateJobBatchStatus(JobStatusManagerImpl.java:82)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.persistJobBatchAndExitStatus(JobThreadRootControllerImpl.java:214)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.endOfJob(JobThreadRootControllerImpl.java:200)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.originateExecutionOnThread(JobThreadRootControllerImpl.java:128)
at com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.enterprise.concurrent.internal.ManagedFutureTask.run(ManagedFutureTask.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)

Warnung: Caught throwable in main execution loop with Throwable message: null, and stack trace: java.lang.NullPointerException
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.updateBatchStatus(BaseStepControllerImpl.java:282)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markStepFailed(BaseStepControllerImpl.java:238)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markJobAndStepFailed(BaseStepControllerImpl.java:243)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.execute(BaseStepControllerImpl.java:128)
at com.ibm.jbatch.container.impl.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:112)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.originateExecutionOnThread(JobThreadRootControllerImpl.java:110)
at com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.enterprise.concurrent.internal.ManagedFutureTask.run(ManagedFutureTask.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)

Warnung: Caught throwable in main execution loop with Throwable message: null, and stack trace: java.lang.NullPointerException
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.updateBatchStatus(BaseStepControllerImpl.java:282)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markStepFailed(BaseStepControllerImpl.java:238)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markJobAndStepFailed(BaseStepControllerImpl.java:243)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.execute(BaseStepControllerImpl.java:128)
at com.ibm.jbatch.container.impl.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:112)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.originateExecutionOnThread(JobThreadRootControllerImpl.java:110)
at com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.enterprise.concurrent.internal.ManagedFutureTask.run(ManagedFutureTask.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)

To reproduce this bug, you have to do the following:

  1. create a simple web-batch app: in my case a simple batchlet with a simple system.out output line. The job gets started via a ejb singleton, which is scheduled for every 5 secs.
  2. create a db which contains the jsr352 schema via the provided jsr352 postgresql sql script.
  3. configure payara to use the postgresql db as job repository via the admin console "Batch/Config".
  4. deploy the app from step 1 to payara

The strange part is, if you set the logging for "fish.payara.jbatch.persistence.rdbms" to FINEST you can avoid the exception above, but this is not reliable. sometimes an exception gets thrown anyway.
For me it seems like some kind of raise-condition occurs.

@tosuns tosuns changed the title JBatch and Postgresql don JBatch and Postgresql db as job repository fails Feb 4, 2015
@smillidge
Copy link
Contributor

Could you let me know your configuration. I have tested a simple batch application on Postgres and it seems to work.

Connection pool Settings are;

ResourceType: javax.sql.DataSource
DataSource ClassName: org.postgresql.ds.PGSimpleDataSource
AdditionalProperties Tab: databaseName = jbatch (the name of the database that contains your jbatch tables
user = user
password = password

In my JBatch runtime configuration
Select JNDI name of the JDBC Resource that refers to the connection pool above
Database schema name: public
Table prefix and table suffix: both blank.

Postgres JDBC driver installed in glassfish/domains/domain1/lib

@smillidge
Copy link
Contributor

Reproduced using Cargo tracker
[#|2015-02-05T22:52:00.051+0000|INFO|Payara 4.1|net.java.cargotracker.interfaces.handling.file.FileProcessorJobListener|_ThreadID=221;_ThreadName=concurrent/__defaultManagedExecutorService-managedThreadFactory-Thread-2;_TimeMillis=1423176720051;_LevelValue=800;|
Handling event file processor batch job starting at 05/02/15 22:52|#]

[#|2015-02-05T22:52:00.058+0000|WARNING|Payara 4.1|com.ibm.jbatch.container.impl.JobThreadRootControllerImpl|_ThreadID=221;_ThreadName=concurrent/__defaultManagedExecutorService-managedThreadFactory-Thread-2;_TimeMillis=1423176720058;_LevelValue=900;|
Caught throwable in main execution loop with Throwable message: null, and stack trace: java.lang.NullPointerException
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.updateBatchStatus(BaseStepControllerImpl.java:282)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markStepFailed(BaseStepControllerImpl.java:238)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markJobAndStepFailed(BaseStepControllerImpl.java:243)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.execute(BaseStepControllerImpl.java:128)
at com.ibm.jbatch.container.impl.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:112)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.originateExecutionOnThread(JobThreadRootControllerImpl.java:110)
at com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.enterprise.concurrent.internal.ManagedFutureTask.run(ManagedFutureTask.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)
|#]

[#|2015-02-05T22:52:00.058+0000|INFO|Payara 4.1|net.java.cargotracker.interfaces.handling.file.FileProcessorJobListener|_ThreadID=221;_ThreadName=concurrent/__defaultManagedExecutorService-managedThreadFactory-Thread-2;_TimeMillis=1423176720058;_LevelValue=800;|
Handling event file processor batch job completed at 05/02/15 22:52|#]

@davewinters
Copy link
Contributor

Reproduced also using cargo tracker but not using the jbatch payroll and job-operator-api samples.

@davewinters
Copy link
Contributor

Error in not seen on other databases such as Oracle, MySQL and derby etc

@davewinters
Copy link
Contributor

Oracle 11g which I tested with also has the transaction isolation set to read_committed so both postgres and oracle have the same transaction isolation level. Change also the tx isolation for the jbatch postgres pool to serializable and the same issue occurs.

@davewinters
Copy link
Contributor

This issue is timing related as already noted. I believe this is what is happening we have two transactions, one is attempting to insert/update a row in the jobstatus table (tx1) while at the same time a select is done to retrieve the value of this row in another transaction (tx2). Since tx2 has started before tx1 has committed its data to the jobstatus table then we receive a NullPointerException since no value is present in the jobstatus table.

The only way I believe to properly fix this issue is to ensure that when the SELECT is done to read the job status row value that updates to the JOBSTATUS table row data are done in the same transaction as we the select can view uncommitted changes if they are in the same transaction.

From the postgres 9.3 docs
Read Committed is the default isolation level in PostgreSQL. When a transaction uses this isolation level, a SELECT query (without a FOR UPDATE/SHARE clause) sees only data committed before the query began; it never sees either uncommitted data or changes committed during query execution by concurrent transactions.

Thoughts??

@davidweaver davidweaver mentioned this issue Nov 12, 2015
jbee pushed a commit to jbee/Payara that referenced this issue Sep 30, 2020
FISH-426: Store initial request path when accessing protected path with OpenIdMechanism
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants