[
https://issues.apache.org/jira/browse/LENS-1461?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16131977#comment-16131977
]
Ankit Kailaswar edited comment on LENS-1461 at 8/18/17 9:49 AM:
----------------------------------------------------------------
There were few issues found while persisting service states and using it to
start lens server.
1. Session service is not getting persisted properly on few occasions. session
service try to serialize few sessions which are invalid using its session
handles throwing an exception uncaught at service level. Other services are
getting persisted successfully.
{panel:title=lens server log
|borderStyle=dashed|borderColor=#ccc|titleBGColor=#F7D6C1|bgColor=#FFFFCE}
14 Aug 2017 20:13:49 6daca8db-deb9-4ab0-ba2d-3f5e474ad545
Lens-server-snapshotter-Thread-1 WARN org.apache.lens.server.BaseLensService -
{color:red} *Session cbc183be-8f05-4356-bb56-6ba43217518b not found* {color}
org.apache.hive.service.cli.HiveSQLException: Invalid SessionHandle:
SessionHandle cbc183be-8f05-4356-bb56-6ba43217518b
at
org.apache.hive.service.cli.session.SessionManager.getSession(SessionManager.java:389)
~hive-service-2.1.3-inm.jar:2.1.3-inm
at
org.apache.lens.server.BaseLensService.getSession(BaseLensService.java:366)
~classes/:na
at
org.apache.lens.server.session.HiveSessionService.writeExternal(HiveSessionService.java:425)
classes/:na
at
org.apache.lens.server.LensServices.persistState(LensServices.java:369)
classes/:na
at
org.apache.lens.server.LensServices.persistLensServiceState(LensServices.java:354)
classes/:na
at org.apache.lens.server.LensServices.access$100(LensServices.java:63)
classes/:na
at org.apache.lens.server.LensServices$1.run(LensServices.java:305)
classes/:na
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
na:1.8.0_72
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
na:1.8.0_72
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
na:1.8.0_72
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
na:1.8.0_72
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
na:1.8.0_72
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
na:1.8.0_72
at java.lang.Thread.run(Thread.java:745) na:1.8.0_72
14 Aug 2017 20:13:49 ba8c2672-53a0-44ad-9d50-fc53e2286143
grizzly-http-server-12 INFO hive.metastore - Closed a connection to metastore,
current connections: 282
14 Aug 2017 20:13:49 ba8c2672-53a0-44ad-9d50-fc53e2286143
grizzly-http-server-12 INFO org.apache.lens.server.BaseLensService - Closed
session <?xml version="1.0" encoding="UTF-8"
standalone="yes"?><lensSessionHandle><publicId>cbc183be-8f05-4356-bb56-6ba43217518b</publicId><secretId>33a980a2-206c-4dbc-b3d9-ffa3a6b6de87</secretId></lensSessionHandle>
for yoda-admin user
14 Aug 2017 20:13:49 6daca8db-deb9-4ab0-ba2d-3f5e474ad545
Lens-server-snapshotter-Thread-1 {color:red} *ERROR
org.apache.lens.server.LensServices - Error while persisting state for service
session* {color}
javax.ws.rs.ClientErrorException: Session cbc183be-8f05-4356-bb56-6ba43217518b
is invalid <?xml version="1.0" encoding="UTF-8"
standalone="yes"?><lensSessionHandle><publicId>cbc183be-8f05-4356-bb56-6ba43217518b</publicId><secretId>33a980a2-206c-4dbc-b3d9-ffa3a6b6de87</secretId></lensSessionHandle>
at
org.apache.lens.server.BaseLensService.getSession(BaseLensService.java:370)
~classes/:na
at
org.apache.lens.server.session.HiveSessionService.writeExternal(HiveSessionService.java:425)
~classes/:na
at
org.apache.lens.server.LensServices.persistState(LensServices.java:369)
classes/:na
at
org.apache.lens.server.LensServices.persistLensServiceState(LensServices.java:354)
classes/:na
at org.apache.lens.server.LensServices.access$100(LensServices.java:63)
classes/:na
at org.apache.lens.server.LensServices$1.run(LensServices.java:305)
classes/:na
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
na:1.8.0_72
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
na:1.8.0_72
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
na:1.8.0_72
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
na:1.8.0_72
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
na:1.8.0_72
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
na:1.8.0_72
at java.lang.Thread.run(Thread.java:745) na:1.8.0_72
Caused by: org.apache.hive.service.cli.HiveSQLException: Invalid SessionHandle:
SessionHandle cbc183be-8f05-4356-bb56-6ba43217518b
at
org.apache.hive.service.cli.session.SessionManager.getSession(SessionManager.java:389)
~hive-service-2.1.3-inm.jar:2.1.3-inm
at
org.apache.lens.server.BaseLensService.getSession(BaseLensService.java:366)
~classes/:na
... 12 common frames omitted
{panel}
This is causing other states to be persisted with updated time while session
service persisted state is older than other causing lens to loose session info
for session created during these period.
This can be fixed by catching exception for invalid sessions and continuing
without serializing it.
2. At the time of startup lens tries to start respective service from last
persisted state for each service. For session service it tries to deserialize
all sessions from persisted state. For few sessions session handles were
serialized as null causing deserialisation of such sessions to to fail and
throw exception caught but not handled causing startup to fail.
{panel:title=lens server log
|borderStyle=dashed|borderColor=#ccc|titleBGColor=#F7D6C1|bgColor=#FFFFCE}
14 Aug 2017 18:53:16 6236aa77-07ff-424a-be02-1c9b11de8862 main {color:red}
*ERROR org.apache.lens.server.LensServices - Could not recover from persisted
state* {color}
java.io.EOFException: null
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340)
~na:1.8.0_72
at
java.io.ObjectInputStream$BlockDataInputStream.readUnsignedShort(ObjectInputStream.java:2818)
~na:1.8.0_72
at
java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2874)
~na:1.8.0_72
at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1073)
~na:1.8.0_72
at
org.apache.lens.server.session.LensSessionImpl$LensSessionPersistInfo.readExternal(LensSessionImpl.java:678)
~classes/:na
at
org.apache.lens.server.session.HiveSessionService.readExternal(HiveSessionService.java:453)
~classes/:na
at
org.apache.lens.server.LensServices.setupPersistedState(LensServices.java:335)
~classes/:na
at org.apache.lens.server.LensServices.init(LensServices.java:268)
~classes/:na
at org.apache.lens.server.LensServer.startServices(LensServer.java:136)
classes/:na
at org.apache.lens.server.LensServer.<init>(LensServer.java:88)
classes/:na
at
org.apache.lens.server.LensServer.createLensServer(LensServer.java:77)
classes/:na
at org.apache.lens.server.LensServer.main(LensServer.java:192)
classes/:na
14 Aug 2017 18:53:16 6236aa77-07ff-424a-be02-1c9b11de8862 main ERROR
org.apache.lens.server.LensServer - Error while creating Lens server
java.lang.RuntimeException: Could not recover from persisted state
at org.apache.lens.server.LensServices.init(LensServices.java:271)
~classes/:na
at org.apache.lens.server.LensServer.startServices(LensServer.java:136)
~classes/:na
at org.apache.lens.server.LensServer.<init>(LensServer.java:88)
~classes/:na
at
org.apache.lens.server.LensServer.createLensServer(LensServer.java:77)
~classes/:na
at org.apache.lens.server.LensServer.main(LensServer.java:192)
~classes/:na
Caused by: java.io.EOFException: null
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340)
~na:1.8.0_72
at
java.io.ObjectInputStream$BlockDataInputStream.readUnsignedShort(ObjectInputStream.java:2818)
~na:1.8.0_72
at
java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2874)
~na:1.8.0_72
at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1073)
~na:1.8.0_72
at
org.apache.lens.server.session.LensSessionImpl$LensSessionPersistInfo.readExternal(LensSessionImpl.java:678)
~classes/:na
at
org.apache.lens.server.session.HiveSessionService.readExternal(HiveSessionService.java:453)
~classes/:na
at
org.apache.lens.server.LensServices.setupPersistedState(LensServices.java:335)
~classes/:na
at org.apache.lens.server.LensServices.init(LensServices.java:268)
~classes/:na
... 4 common frames omitted
14 Aug 2017 18:53:16 6236aa77-07ff-424a-be02-1c9b11de8862 main INFO
org.apache.lens.server.LensServices - {color:red} *Stopping lens server*
{color}
14 Aug 2017 18:53:16 6236aa77-07ff-424a-be02-1c9b11de8862 main ERROR
org.apache.lens.server.LensServer - {color:red} *Error stopping services*
{color}
java.lang.NullPointerException: null
at
org.apache.lens.server.query.QueryExecutionServiceImpl.prepareStopping(QueryExecutionServiceImpl.java:1428)
~classes/:na
at org.apache.lens.server.LensServices.stop(LensServices.java:408)
~classes/:na
at org.apache.lens.server.LensServer.main(LensServer.java:202)
~classes/:na
{panel}
root cause :
we persist session service by serializing each active "lens" session. session
service stores lens session handles for each service and uses it get session
info that needs to be serialized. It gets session object for lens in following
sequence,
1. create new hive session handle from lens session handle
2. get hive session object from session manager using this newly created hive
session handle
3. downcast hive session object "HiveSession" to "LensSessionImpl" assuming its
instance of "LensSessionImpl" since it was created as a instance of
"LensSessionImpl"
4. serialize it
It works fine when it is valid session for both hive and lens.
session timeout for lens and hive are 1 day and 3 days respectievely. For a
session which is 2 days old session manager returns valid object for
HiveSession but its no longer a instance of "LensSessionImpl" since lens
session already expired. causing downcasting to initialize lens related member
variable(LensSessionHandle, db, username, password etc) to null causing
deserializer to fail for them.
Proposed Fix,
1. While deserializing we can catch exception and ignoring invalid "lens"
session. This will fix the issue of lens failing to start due to invalid lens
session.
2. downcasting is done in getsession() method in LensSessionImpl and referenced
at lot of places. That might be causing other bugs apart from mentioned above.
We have to avoid downcasting or need to have conditional downcasting using RTTI.
3. We need to have constraint that lens session timeout is always greater than
or equal to hive session timeout. That way session manager will always throw
invalid session exception.
was (Author: ankitkailaswar):
There were few issues found while persisting service states and using it to
start lens server.
1. Session service is not getting persisted properly on few occasions. session
service try to serialize few sessions which are invalid using its session
handles throwing an exception uncaught at service level. Other services are
getting persisted successfully.
{panel:title=lens server log
|borderStyle=dashed|borderColor=#ccc|titleBGColor=#F7D6C1|bgColor=#FFFFCE}
14 Aug 2017 20:13:49 6daca8db-deb9-4ab0-ba2d-3f5e474ad545
Lens-server-snapshotter-Thread-1 WARN org.apache.lens.server.BaseLensService -
{color:red} *Session cbc183be-8f05-4356-bb56-6ba43217518b not found* {color}
org.apache.hive.service.cli.HiveSQLException: Invalid SessionHandle:
SessionHandle cbc183be-8f05-4356-bb56-6ba43217518b
at
org.apache.hive.service.cli.session.SessionManager.getSession(SessionManager.java:389)
~hive-service-2.1.3-inm.jar:2.1.3-inm
at
org.apache.lens.server.BaseLensService.getSession(BaseLensService.java:366)
~classes/:na
at
org.apache.lens.server.session.HiveSessionService.writeExternal(HiveSessionService.java:425)
classes/:na
at
org.apache.lens.server.LensServices.persistState(LensServices.java:369)
classes/:na
at
org.apache.lens.server.LensServices.persistLensServiceState(LensServices.java:354)
classes/:na
at org.apache.lens.server.LensServices.access$100(LensServices.java:63)
classes/:na
at org.apache.lens.server.LensServices$1.run(LensServices.java:305)
classes/:na
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
na:1.8.0_72
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
na:1.8.0_72
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
na:1.8.0_72
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
na:1.8.0_72
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
na:1.8.0_72
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
na:1.8.0_72
at java.lang.Thread.run(Thread.java:745) na:1.8.0_72
14 Aug 2017 20:13:49 ba8c2672-53a0-44ad-9d50-fc53e2286143
grizzly-http-server-12 INFO hive.metastore - Closed a connection to metastore,
current connections: 282
14 Aug 2017 20:13:49 ba8c2672-53a0-44ad-9d50-fc53e2286143
grizzly-http-server-12 INFO org.apache.lens.server.BaseLensService - Closed
session <?xml version="1.0" encoding="UTF-8"
standalone="yes"?><lensSessionHandle><publicId>cbc183be-8f05-4356-bb56-6ba43217518b</publicId><secretId>33a980a2-206c-4dbc-b3d9-ffa3a6b6de87</secretId></lensSessionHandle>
for yoda-admin user
14 Aug 2017 20:13:49 6daca8db-deb9-4ab0-ba2d-3f5e474ad545
Lens-server-snapshotter-Thread-1 ERROR org.apache.lens.server.LensServices -
Error while persisting state for service session
javax.ws.rs.ClientErrorException: Session cbc183be-8f05-4356-bb56-6ba43217518b
is invalid <?xml version="1.0" encoding="UTF-8"
standalone="yes"?><lensSessionHandle><publicId>cbc183be-8f05-4356-bb56-6ba43217518b</publicId><secretId>33a980a2-206c-4dbc-b3d9-ffa3a6b6de87</secretId></lensSessionHandle>
at
org.apache.lens.server.BaseLensService.getSession(BaseLensService.java:370)
~classes/:na
at
org.apache.lens.server.session.HiveSessionService.writeExternal(HiveSessionService.java:425)
~classes/:na
at
org.apache.lens.server.LensServices.persistState(LensServices.java:369)
classes/:na
at
org.apache.lens.server.LensServices.persistLensServiceState(LensServices.java:354)
classes/:na
at org.apache.lens.server.LensServices.access$100(LensServices.java:63)
classes/:na
at org.apache.lens.server.LensServices$1.run(LensServices.java:305)
classes/:na
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
na:1.8.0_72
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
na:1.8.0_72
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
na:1.8.0_72
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
na:1.8.0_72
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
na:1.8.0_72
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
na:1.8.0_72
at java.lang.Thread.run(Thread.java:745) na:1.8.0_72
Caused by: org.apache.hive.service.cli.HiveSQLException: Invalid SessionHandle:
SessionHandle cbc183be-8f05-4356-bb56-6ba43217518b
at
org.apache.hive.service.cli.session.SessionManager.getSession(SessionManager.java:389)
~hive-service-2.1.3-inm.jar:2.1.3-inm
at
org.apache.lens.server.BaseLensService.getSession(BaseLensService.java:366)
~classes/:na
... 12 common frames omitted
{panel}
This is causing other states to be persisted with updated time while session
service persisted state is older than other causing lens to loose session info
for session created during these period.
This can be fixed by catching exception for invalid sessions and continuing
without serializing it.
2. At the time of startup lens tries to start respective service from last
persisted state for each service. For session service it tries to deserialize
all sessions from persisted state. For few sessions session handles were
serialized as null causing deserialisation of such sessions to to fail and
throw exception caught but not handled causing startup to fail.
{panel:title=lens server log
|borderStyle=dashed|borderColor=#ccc|titleBGColor=#F7D6C1|bgColor=#FFFFCE}
14 Aug 2017 18:53:16 6236aa77-07ff-424a-be02-1c9b11de8862 main {color:red}
*ERROR org.apache.lens.server.LensServices - Could not recover from persisted
state* {color}
java.io.EOFException: null
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340)
~na:1.8.0_72
at
java.io.ObjectInputStream$BlockDataInputStream.readUnsignedShort(ObjectInputStream.java:2818)
~na:1.8.0_72
at
java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2874)
~na:1.8.0_72
at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1073)
~na:1.8.0_72
at
org.apache.lens.server.session.LensSessionImpl$LensSessionPersistInfo.readExternal(LensSessionImpl.java:678)
~classes/:na
at
org.apache.lens.server.session.HiveSessionService.readExternal(HiveSessionService.java:453)
~classes/:na
at
org.apache.lens.server.LensServices.setupPersistedState(LensServices.java:335)
~classes/:na
at org.apache.lens.server.LensServices.init(LensServices.java:268)
~classes/:na
at org.apache.lens.server.LensServer.startServices(LensServer.java:136)
classes/:na
at org.apache.lens.server.LensServer.<init>(LensServer.java:88)
classes/:na
at
org.apache.lens.server.LensServer.createLensServer(LensServer.java:77)
classes/:na
at org.apache.lens.server.LensServer.main(LensServer.java:192)
classes/:na
14 Aug 2017 18:53:16 6236aa77-07ff-424a-be02-1c9b11de8862 main ERROR
org.apache.lens.server.LensServer - Error while creating Lens server
java.lang.RuntimeException: Could not recover from persisted state
at org.apache.lens.server.LensServices.init(LensServices.java:271)
~classes/:na
at org.apache.lens.server.LensServer.startServices(LensServer.java:136)
~classes/:na
at org.apache.lens.server.LensServer.<init>(LensServer.java:88)
~classes/:na
at
org.apache.lens.server.LensServer.createLensServer(LensServer.java:77)
~classes/:na
at org.apache.lens.server.LensServer.main(LensServer.java:192)
~classes/:na
Caused by: java.io.EOFException: null
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:340)
~na:1.8.0_72
at
java.io.ObjectInputStream$BlockDataInputStream.readUnsignedShort(ObjectInputStream.java:2818)
~na:1.8.0_72
at
java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2874)
~na:1.8.0_72
at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1073)
~na:1.8.0_72
at
org.apache.lens.server.session.LensSessionImpl$LensSessionPersistInfo.readExternal(LensSessionImpl.java:678)
~classes/:na
at
org.apache.lens.server.session.HiveSessionService.readExternal(HiveSessionService.java:453)
~classes/:na
at
org.apache.lens.server.LensServices.setupPersistedState(LensServices.java:335)
~classes/:na
at org.apache.lens.server.LensServices.init(LensServices.java:268)
~classes/:na
... 4 common frames omitted
14 Aug 2017 18:53:16 6236aa77-07ff-424a-be02-1c9b11de8862 main INFO
org.apache.lens.server.LensServices - {color:red} *Stopping lens server*
{color}
14 Aug 2017 18:53:16 6236aa77-07ff-424a-be02-1c9b11de8862 main ERROR
org.apache.lens.server.LensServer - {color:red} *Error stopping services*
{color}
java.lang.NullPointerException: null
at
org.apache.lens.server.query.QueryExecutionServiceImpl.prepareStopping(QueryExecutionServiceImpl.java:1428)
~classes/:na
at org.apache.lens.server.LensServices.stop(LensServices.java:408)
~classes/:na
at org.apache.lens.server.LensServer.main(LensServer.java:202)
~classes/:na
{panel}
root cause :
we persist session service by serializing each active "lens" session. session
service stores lens session handles for each service and uses it get session
info that needs to be serialized. It gets session object for lens in following
sequence,
1. create new hive session handle from lens session handle
2. get hive session object from session manager using this newly created hive
session handle
3. downcast hive session object "HiveSession" to "LensSessionImpl" assuming its
instance of "LensSessionImpl" since it was created as a instance of
"LensSessionImpl"
4. serialize it
It works fine when it is valid session for both hive and lens.
session timeout for lens and hive are 1 day and 3 days respectievely. For a
session which is 2 days old session manager returns valid object for
HiveSession but its no longer a instance of "LensSessionImpl" since lens
session already expired. causing downcasting to initialize lens related member
variable(LensSessionHandle, db, username, password etc) to null causing
deserializer to fail for them.
Proposed Fix,
1. While deserializing we can catch exception and ignoring invalid "lens"
session. This will fix the issue of lens failing to start due to invalid lens
session.
2. downcasting is done in getsession() method in LensSessionImpl and referenced
at lot of places. That might be causing other bugs apart from mentioned above.
We have to avoid downcasting or need to have conditional downcasting using RTTI.
3. We need to have constraint that lens session timeout is always greater than
or equal to hive session timeout. That way session manager will always throw
invalid session exception.
> Lens services state are not persisted correctly
> -----------------------------------------------
>
> Key: LENS-1461
> URL: https://issues.apache.org/jira/browse/LENS-1461
> Project: Apache Lens
> Issue Type: Bug
> Components: server
> Reporter: Ankit Kailaswar
> Assignee: Ankit Kailaswar
>
> Lens services state are not persisted correctly causing lens to fail at
> startup.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)