Description
We should call connectionQueryServices#init in the else block of this 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; }
like this instead:
@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; }
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.