You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@geode.apache.org by "Nick Reich (JIRA)" <ji...@apache.org> on 2018/03/28 22:34:00 UTC

[jira] [Reopened] (GEODE-4833) JdbcWriter and JdbcAsyncWriter may fail to write null fields to database

     [ https://issues.apache.org/jira/browse/GEODE-4833?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Nick Reich reopened GEODE-4833:
-------------------------------

Postgres fails to write nulls to the database, with the following exception (appears to be trying to write the null character instead of the NULL sql type):
{noformat}
org.apache.geode.test.dunit.RMIException: While invoking org.apache.geode.connectors.jdbc.JdbcDistributedTest$$Lambda$101/1502079282.run in VM 2 running on Host 10.118.19.40 with 4 VMs

	at org.apache.geode.test.dunit.VM.invoke(VM.java:401)
	at org.apache.geode.test.dunit.VM.invoke(VM.java:370)
	at org.apache.geode.test.dunit.VM.invoke(VM.java:313)
	at org.apache.geode.test.junit.rules.VMProvider.invoke(VMProvider.java:41)
	at org.apache.geode.connectors.jdbc.JdbcDistributedTest.clientPutsAndGetsWithNullFieldsWithPdxClassName(JdbcDistributedTest.java:520)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.apache.geode.test.junit.rules.DescribedExternalResource$1.evaluate(DescribedExternalResource.java:37)
	at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
	at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.apache.geode.cache.client.ServerOperationException: remote server on 10.118.19.40(23110:loner):63789:0b31ad6e: : While performing a remote put
	at org.apache.geode.cache.client.internal.PutOp$PutOpImpl.processAck(PutOp.java:385)
	at org.apache.geode.cache.client.internal.PutOp$PutOpImpl.processResponse(PutOp.java:309)
	at org.apache.geode.cache.client.internal.PutOp$PutOpImpl.attemptReadResponse(PutOp.java:470)
	at org.apache.geode.cache.client.internal.AbstractOp.attempt(AbstractOp.java:388)
	at org.apache.geode.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:276)
	at org.apache.geode.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:327)
	at org.apache.geode.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:885)
	at org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:170)
	at org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:127)
	at org.apache.geode.cache.client.internal.PoolImpl.execute(PoolImpl.java:782)
	at org.apache.geode.cache.client.internal.PutOp.execute(PutOp.java:91)
	at org.apache.geode.cache.client.internal.ServerRegionProxy.put(ServerRegionProxy.java:159)
	at org.apache.geode.internal.cache.LocalRegion.serverPut(LocalRegion.java:3009)
	at org.apache.geode.internal.cache.LocalRegion.cacheWriteBeforePut(LocalRegion.java:3120)
	at org.apache.geode.internal.cache.ProxyRegionMap.basicPut(ProxyRegionMap.java:239)
	at org.apache.geode.internal.cache.LocalRegion.virtualPut(LocalRegion.java:5635)
	at org.apache.geode.internal.cache.LocalRegionDataView.putEntry(LocalRegionDataView.java:152)
	at org.apache.geode.internal.cache.LocalRegion.basicPut(LocalRegion.java:5063)
	at org.apache.geode.internal.cache.LocalRegion.validatedPut(LocalRegion.java:1596)
	at org.apache.geode.internal.cache.LocalRegion.put(LocalRegion.java:1583)
	at org.apache.geode.internal.cache.AbstractRegion.put(AbstractRegion.java:318)
	at org.apache.geode.connectors.jdbc.JdbcDistributedTest.lambda$clientPutsAndGetsWithNullFieldsWithPdxClassName$bb17a952$1(JdbcDistributedTest.java:525)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at hydra.MethExecutor.executeObject(MethExecutor.java:244)
	at org.apache.geode.test.dunit.standalone.RemoteDUnitVM.executeMethodOnObject(RemoteDUnitVM.java:70)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
	at sun.rmi.transport.Transport$1.run(Transport.java:200)
	at sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.geode.connectors.jdbc.JdbcConnectorException: ERROR: invalid byte sequence for encoding "UTF8": 0x00
org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2433)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2178)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:306)
	at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
	at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
	at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:155)
	at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:132)
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
	at org.apache.geode.connectors.jdbc.internal.SqlHandler.executeWriteStatement(SqlHandler.java:193)
	at org.apache.geode.connectors.jdbc.internal.SqlHandler.write(SqlHandler.java:178)
	at org.apache.geode.connectors.jdbc.JdbcWriter.writeEvent(JdbcWriter.java:85)
	at org.apache.geode.connectors.jdbc.JdbcWriter.beforeCreate(JdbcWriter.java:60)
	at org.apache.geode.internal.cache.SearchLoadAndWriteProcessor.doLocalWrite(SearchLoadAndWriteProcessor.java:872)
	at org.apache.geode.internal.cache.SearchLoadAndWriteProcessor.doNetWrite(SearchLoadAndWriteProcessor.java:209)
	at org.apache.geode.internal.cache.DistributedRegion.cacheWriteBeforePut(DistributedRegion.java:2599)
	at org.apache.geode.internal.cache.AbstractRegionMap.invokeCacheWriter(AbstractRegionMap.java:2569)
	at org.apache.geode.internal.cache.AbstractRegionMap.basicPut(AbstractRegionMap.java:2328)
	at org.apache.geode.internal.cache.LocalRegion.virtualPut(LocalRegion.java:5635)
	at org.apache.geode.internal.cache.DistributedRegion.virtualPut(DistributedRegion.java:371)
	at org.apache.geode.internal.cache.LocalRegionDataView.putEntry(LocalRegionDataView.java:152)
	at org.apache.geode.internal.cache.LocalRegion.basicUpdate(LocalRegion.java:5616)
	at org.apache.geode.internal.cache.LocalRegion.basicBridgePut(LocalRegion.java:5252)
	at org.apache.geode.internal.cache.tier.sockets.command.Put65.cmdExecute(Put65.java:390)
	at org.apache.geode.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:163)
	at org.apache.geode.internal.cache.tier.sockets.ServerConnection.doNormalMsg(ServerConnection.java:868)
	at org.apache.geode.internal.cache.tier.sockets.OriginalServerConnection.doOneMessage(OriginalServerConnection.java:85)
	at org.apache.geode.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1248)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.geode.internal.cache.tier.sockets.AcceptorImpl$4$1.run(AcceptorImpl.java:644)
	at java.lang.Thread.run(Thread.java:748)

	at org.apache.geode.connectors.jdbc.JdbcConnectorException.createException(JdbcConnectorException.java:48)
	at org.apache.geode.connectors.jdbc.JdbcWriter.writeEvent(JdbcWriter.java:88)
	at org.apache.geode.connectors.jdbc.JdbcWriter.beforeCreate(JdbcWriter.java:60)
	at org.apache.geode.internal.cache.SearchLoadAndWriteProcessor.doLocalWrite(SearchLoadAndWriteProcessor.java:872)
	at org.apache.geode.internal.cache.SearchLoadAndWriteProcessor.doNetWrite(SearchLoadAndWriteProcessor.java:209)
	at org.apache.geode.internal.cache.DistributedRegion.cacheWriteBeforePut(DistributedRegion.java:2599)
	at org.apache.geode.internal.cache.AbstractRegionMap.invokeCacheWriter(AbstractRegionMap.java:2569)
	at org.apache.geode.internal.cache.AbstractRegionMap.basicPut(AbstractRegionMap.java:2328)
	at org.apache.geode.internal.cache.LocalRegion.virtualPut(LocalRegion.java:5635)
	at org.apache.geode.internal.cache.DistributedRegion.virtualPut(DistributedRegion.java:371)
	at org.apache.geode.internal.cache.LocalRegionDataView.putEntry(LocalRegionDataView.java:152)
	at org.apache.geode.internal.cache.LocalRegion.basicUpdate(LocalRegion.java:5616)
	at org.apache.geode.internal.cache.LocalRegion.basicBridgePut(LocalRegion.java:5252)
	at org.apache.geode.internal.cache.tier.sockets.command.Put65.cmdExecute(Put65.java:390)
	at org.apache.geode.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:163)
	at org.apache.geode.internal.cache.tier.sockets.ServerConnection.doNormalMsg(ServerConnection.java:868)
	at org.apache.geode.internal.cache.tier.sockets.OriginalServerConnection.doOneMessage(OriginalServerConnection.java:85)
	at org.apache.geode.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1248)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.geode.internal.cache.tier.sockets.AcceptorImpl$4$1.run(AcceptorImpl.java:644)
	... 1 more
{noformat}

> JdbcWriter and JdbcAsyncWriter may fail to write null fields to database
> ------------------------------------------------------------------------
>
>                 Key: GEODE-4833
>                 URL: https://issues.apache.org/jira/browse/GEODE-4833
>             Project: Geode
>          Issue Type: Bug
>          Components: extensions, regions
>    Affects Versions: 1.4.0
>            Reporter: Darrel Schneider
>            Assignee: Darrel Schneider
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 1.6.0
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> Both JdbcWriter and JdbcAsyncWriter end up calling the JDBC method PreparedStatement.setObject with a value of "null" if the pdx field contains "null".
> This will work with jdbc drivers that support sending "non-typed Null" to the backend database.
> But some drivers do not support this and these puts will fail with a SQLException.
> For portability the jdbc connector should be changed to not pass "null" to setObject without a type.
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)