[ https://issues.apache.org/jira/browse/PHOENIX-901?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13950122#comment-13950122 ]
James Taylor commented on PHOENIX-901: -------------------------------------- The problem with the simple fix is that we'd be handing off a ConnectionQueryServices which isn't yet initialized (which is bad). This patch will cause them to block on the init method instead. It could be fancier and not synchronize if already initialized. > Ensure ConnectionQueryServices only initialized once > ---------------------------------------------------- > > Key: PHOENIX-901 > URL: https://issues.apache.org/jira/browse/PHOENIX-901 > Project: Phoenix > Issue Type: Bug > Reporter: James Taylor > Assignee: James Taylor > Attachments: phoenix.patch > > > We should call connectionQueryServices#init in the else block of this code: > {code} > @Override > protected ConnectionQueryServices getConnectionQueryServices(String url, > Properties info) throws SQLException { > checkClosed(); > ConnectionInfo connInfo = ConnectionInfo.create(url); > ConnectionInfo normalizedConnInfo = > connInfo.normalize(getQueryServices().getProps()); > ConnectionQueryServices connectionQueryServices = > connectionQueryServicesMap.get(normalizedConnInfo); > if (connectionQueryServices == null) { > if (normalizedConnInfo.isConnectionless()) { > connectionQueryServices = new > ConnectionlessQueryServicesImpl(getQueryServices()); > } else { > connectionQueryServices = new > ConnectionQueryServicesImpl(getQueryServices(), normalizedConnInfo); > } > connectionQueryServices.init(url, info); > ConnectionQueryServices prevValue = > connectionQueryServicesMap.putIfAbsent(normalizedConnInfo, > connectionQueryServices); > if (prevValue != null) { > connectionQueryServices = prevValue; > } > } > return connectionQueryServices; > } > {code} > like this instead: > {code} > @Override > protected ConnectionQueryServices getConnectionQueryServices(String url, > Properties info) throws SQLException { > checkClosed(); > ConnectionInfo connInfo = ConnectionInfo.create(url); > ConnectionInfo normalizedConnInfo = > connInfo.normalize(getQueryServices().getProps()); > ConnectionQueryServices connectionQueryServices = > connectionQueryServicesMap.get(normalizedConnInfo); > if (connectionQueryServices == null) { > if (normalizedConnInfo.isConnectionless()) { > connectionQueryServices = new > ConnectionlessQueryServicesImpl(getQueryServices()); > } else { > connectionQueryServices = new > ConnectionQueryServicesImpl(getQueryServices(), normalizedConnInfo); > } > ConnectionQueryServices prevValue = > connectionQueryServicesMap.putIfAbsent(normalizedConnInfo, > connectionQueryServices); > if (prevValue != null) { > connectionQueryServices = prevValue; > } else { > connectionQueryServices.init(url, info); > } > } > return connectionQueryServices; > } > {code} > This has the potential to open multiple HConnections, but it's unclear if > this causes harm, as the same, original ConnectionQueryService is returned > and used. -- This message was sent by Atlassian JIRA (v6.2#6252)