[ https://issues.apache.org/jira/browse/PHOENIX-856?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
James Taylor updated PHOENIX-856: --------------------------------- Affects Version/s: 5.0.0 4.0.0 3.0.0 Fix Version/s: 5.0.0 4.0.0 3.0.0 > Allow phoenix driver reuse after being closed > --------------------------------------------- > > Key: PHOENIX-856 > URL: https://issues.apache.org/jira/browse/PHOENIX-856 > Project: Phoenix > Issue Type: Improvement > Affects Versions: 3.0.0, 4.0.0, 5.0.0 > Reporter: Bruno Dumon > Fix For: 3.0.0, 4.0.0, 5.0.0 > > Attachments: allow-driver-restart.patch.txt, > check-driver-closed.patch.txt > > > Attached patch will allow to close the phoenix driver and re-use it later on. > *Motivation* > I ran into this because I have a testcase where I start an > HBaseTestingUtility, do some tests, stop it, and start it again to run the > same tests with some different configs. This happens in one testcase because > I want to compare the results of the two runs. > Since the 'cluster' is stopped between the two runs, I need to stop the > Phoenix driver as well using PhoenixDriver.INSTANCE.close() (If I don't do > this, it works as well but takes tons of time, I think because HBase needs to > figure out it needs to create a new ZK connection). Previously this worked > fine, but was recently broke likely because > "services.getExecutor().shutdownNow()" was added. > *Proposed changes* > The proposed patch sets services to null after the services are closed, so > that they will be reopened the next time the driver is used. > Now, this change might lead to unexpected behavior: you call close(), and if > after that some other thread still does something with Phoenix, the effect of > the close call would be cancelled. > Besides this, if you currently try to use the driver after it is closed, it > gives a rather confusing message: > {noformat} > java.sql.SQLException: ERROR 2006 (INT08): Incompatible jars detected between > client and server. Ensure that phoenix.jar is put on the classpath of HBase > in every region server: Task > org.apache.phoenix.job.JobManager$JobFutureTask@2c46358e rejected from > org.apache.phoenix.job.JobManager$1@35661457[Terminated, pool size = 0, > active threads = 0, queued tasks = 0, completed tasks = 43] > at > java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2048) > at > java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821) > at > java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372) > at > java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:132) > at > org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processExecs(HConnectionManager.java:1462) > at > org.apache.phoenix.query.ConnectionQueryServicesImpl.checkClientServerCompatibility(ConnectionQueryServicesImpl.java:828) > at > org.apache.phoenix.query.ConnectionQueryServicesImpl.ensureTableCreated(ConnectionQueryServicesImpl.java:735) > at > org.apache.phoenix.query.ConnectionQueryServicesImpl.createTable(ConnectionQueryServicesImpl.java:983) > at > org.apache.phoenix.schema.MetaDataClient.createTableInternal(MetaDataClient.java:1133) > {noformat} > Therefore: > * I introduced a closed flag so that we can check if the driver is closed > and throw an exception if it is used after closing > * I introduced a softClose() method for the case where you want to close > current resources but want to allow continued use of the driver. -- This message was sent by Atlassian JIRA (v6.2#6252)