public void returnConnection(RedisConnection connection) { SubscribesConnectionEntry entry = clients.get(connection.getRedisClient()); if (entry.isFreezed()) { connection.closeAsync(); } else { entry.getConnections().add(connection); } entry.getConnectionsSemaphore().release(); }
public synchronized Collection<RedisPubSubConnection> freeze(String host, int port) { InetSocketAddress addr = new InetSocketAddress(host, port); for (SubscribesConnectionEntry connectionEntry : clients.values()) { if (connectionEntry.isFreezed() || !connectionEntry.getClient().getAddr().equals(addr)) { continue; } log.debug("{} freezed", addr); connectionEntry.setFreezed(true); // close all connections while (true) { RedisConnection connection = connectionEntry.getConnections().poll(); if (connection == null) { break; } connection.closeAsync(); } // close all pub/sub connections while (true) { RedisPubSubConnection connection = connectionEntry.pollFreeSubscribeConnection(); if (connection == null) { break; } connection.closeAsync(); } boolean allFreezed = true; for (SubscribesConnectionEntry entry : clients.values()) { if (!entry.isFreezed()) { allFreezed = false; break; } } if (allFreezed) { clientsEmpty.close(); } List<RedisPubSubConnection> list = new ArrayList<RedisPubSubConnection>(connectionEntry.getAllSubscribeConnections()); connectionEntry.getAllSubscribeConnections().clear(); return list; } return Collections.emptyList(); }
private RedisConnection retrieveConnection(SubscribesConnectionEntry entry) { if (entry.isFreezed() || !entry.getConnectionsSemaphore().tryAcquire()) { return null; } else { RedisConnection conn = entry.getConnections().poll(); if (conn != null) { return conn; } try { return entry.connect(config); } catch (RedisException e) { entry.getConnectionsSemaphore().release(); // TODO connection scoring log.warn("Can't connect to {}, trying next connection!", entry.getClient().getAddr()); return null; } } }