mirror of
				https://github.com/proxiodev/RedisBungee.git
				synced 2025-10-31 15:58:03 +00:00 
			
		
		
		
	Better handling of improperly-fetched Jedis resources.
This commit is contained in:
		
							parent
							
								
									cb61d90d6c
								
							
						
					
					
						commit
						e630116ff8
					
				| @ -68,7 +68,8 @@ public class DataManager implements Listener { | |||||||
|         } catch (JedisConnectionException e) { |         } catch (JedisConnectionException e) { | ||||||
|             // Redis server has disappeared! |             // Redis server has disappeared! | ||||||
|             plugin.getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); |             plugin.getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); | ||||||
|             plugin.getPool().returnBrokenResource(tmpRsc); |             if (tmpRsc != null) | ||||||
|  |                 plugin.getPool().returnBrokenResource(tmpRsc); | ||||||
|             throw new RuntimeException("Unable to get server for " + uuid, e); |             throw new RuntimeException("Unable to get server for " + uuid, e); | ||||||
|         } finally { |         } finally { | ||||||
|             plugin.getPool().returnResource(tmpRsc); |             plugin.getPool().returnResource(tmpRsc); | ||||||
| @ -98,7 +99,8 @@ public class DataManager implements Listener { | |||||||
|         } catch (JedisConnectionException e) { |         } catch (JedisConnectionException e) { | ||||||
|             // Redis server has disappeared! |             // Redis server has disappeared! | ||||||
|             plugin.getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); |             plugin.getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); | ||||||
|             plugin.getPool().returnBrokenResource(tmpRsc); |             if (tmpRsc != null) | ||||||
|  |                 plugin.getPool().returnBrokenResource(tmpRsc); | ||||||
|             throw new RuntimeException("Unable to get server for " + uuid, e); |             throw new RuntimeException("Unable to get server for " + uuid, e); | ||||||
|         } finally { |         } finally { | ||||||
|             plugin.getPool().returnResource(tmpRsc); |             plugin.getPool().returnResource(tmpRsc); | ||||||
| @ -132,7 +134,8 @@ public class DataManager implements Listener { | |||||||
|         } catch (JedisConnectionException e) { |         } catch (JedisConnectionException e) { | ||||||
|             // Redis server has disappeared! |             // Redis server has disappeared! | ||||||
|             plugin.getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); |             plugin.getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); | ||||||
|             plugin.getPool().returnBrokenResource(tmpRsc); |             if (tmpRsc != null) | ||||||
|  |                 plugin.getPool().returnBrokenResource(tmpRsc); | ||||||
|             throw new RuntimeException("Unable to get server for " + uuid, e); |             throw new RuntimeException("Unable to get server for " + uuid, e); | ||||||
|         } catch (UnknownHostException e) { |         } catch (UnknownHostException e) { | ||||||
|             return null; |             return null; | ||||||
| @ -191,7 +194,8 @@ public class DataManager implements Listener { | |||||||
|         } catch (JedisConnectionException e) { |         } catch (JedisConnectionException e) { | ||||||
|             // Redis server has disappeared! |             // Redis server has disappeared! | ||||||
|             plugin.getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); |             plugin.getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); | ||||||
|             plugin.getPool().returnBrokenResource(tmpRsc); |             if (tmpRsc != null) | ||||||
|  |                 plugin.getPool().returnBrokenResource(tmpRsc); | ||||||
|             throw new RuntimeException("Unable to get server for " + uuid, e); |             throw new RuntimeException("Unable to get server for " + uuid, e); | ||||||
|         } finally { |         } finally { | ||||||
|             plugin.getPool().returnResource(tmpRsc); |             plugin.getPool().returnResource(tmpRsc); | ||||||
|  | |||||||
| @ -106,7 +106,8 @@ public final class RedisBungee extends Plugin { | |||||||
|             return servers.build(); |             return servers.build(); | ||||||
|         } catch (JedisConnectionException e) { |         } catch (JedisConnectionException e) { | ||||||
|             getLogger().log(Level.SEVERE, "Unable to fetch all server IDs", e); |             getLogger().log(Level.SEVERE, "Unable to fetch all server IDs", e); | ||||||
|             pool.returnBrokenResource(jedis); |             if (jedis != null) | ||||||
|  |                 pool.returnBrokenResource(jedis); | ||||||
|             return Collections.singletonList(serverId); |             return Collections.singletonList(serverId); | ||||||
|         } finally { |         } finally { | ||||||
|             pool.returnResource(jedis); |             pool.returnResource(jedis); | ||||||
| @ -135,7 +136,8 @@ public final class RedisBungee extends Plugin { | |||||||
|             } catch (JedisConnectionException e) { |             } catch (JedisConnectionException e) { | ||||||
|                 // Redis server has disappeared! |                 // Redis server has disappeared! | ||||||
|                 getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); |                 getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); | ||||||
|                 pool.returnBrokenResource(rsc); |                 if (rsc != null) | ||||||
|  |                     pool.returnBrokenResource(rsc); | ||||||
|                 throw new RuntimeException("Unable to get total player count", e); |                 throw new RuntimeException("Unable to get total player count", e); | ||||||
|             } finally { |             } finally { | ||||||
|                 pool.returnResource(rsc); |                 pool.returnResource(rsc); | ||||||
| @ -181,7 +183,8 @@ public final class RedisBungee extends Plugin { | |||||||
|             } catch (JedisConnectionException e) { |             } catch (JedisConnectionException e) { | ||||||
|                 // Redis server has disappeared! |                 // Redis server has disappeared! | ||||||
|                 getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); |                 getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); | ||||||
|                 pool.returnBrokenResource(rsc); |                 if (rsc != null) | ||||||
|  |                     pool.returnBrokenResource(rsc); | ||||||
|                 throw new RuntimeException("Unable to get all players online", e); |                 throw new RuntimeException("Unable to get all players online", e); | ||||||
|             } finally { |             } finally { | ||||||
|                 pool.returnResource(rsc); |                 pool.returnResource(rsc); | ||||||
| @ -197,17 +200,7 @@ public final class RedisBungee extends Plugin { | |||||||
| 
 | 
 | ||||||
|     final void sendProxyCommand(@NonNull String proxyId, @NonNull String command) { |     final void sendProxyCommand(@NonNull String proxyId, @NonNull String command) { | ||||||
|         checkArgument(getServerIds().contains(proxyId) || proxyId.equals("allservers"), "proxyId is invalid"); |         checkArgument(getServerIds().contains(proxyId) || proxyId.equals("allservers"), "proxyId is invalid"); | ||||||
|         Jedis jedis = pool.getResource(); |         sendChannelMessage("redisbungee-" + proxyId, command); | ||||||
|         try { |  | ||||||
|             jedis.publish("redisbungee-" + proxyId, command); |  | ||||||
|         } catch (JedisConnectionException e) { |  | ||||||
|             // Redis server has disappeared! |  | ||||||
|             getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); |  | ||||||
|             pool.returnBrokenResource(jedis); |  | ||||||
|             throw new RuntimeException("Unable to publish command", e); |  | ||||||
|         } finally { |  | ||||||
|             pool.returnResource(jedis); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     final void sendChannelMessage(String channel, String message) { |     final void sendChannelMessage(String channel, String message) { | ||||||
| @ -217,7 +210,8 @@ public final class RedisBungee extends Plugin { | |||||||
|         } catch (JedisConnectionException e) { |         } catch (JedisConnectionException e) { | ||||||
|             // Redis server has disappeared! |             // Redis server has disappeared! | ||||||
|             getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); |             getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e); | ||||||
|             pool.returnBrokenResource(jedis); |             if (jedis != null) | ||||||
|  |                 pool.returnBrokenResource(jedis); | ||||||
|             throw new RuntimeException("Unable to publish channel message", e); |             throw new RuntimeException("Unable to publish channel message", e); | ||||||
|         } finally { |         } finally { | ||||||
|             pool.returnResource(jedis); |             pool.returnResource(jedis); | ||||||
|  | |||||||
| @ -13,6 +13,7 @@ import lombok.NonNull; | |||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
| import net.md_5.bungee.api.ProxyServer; | import net.md_5.bungee.api.ProxyServer; | ||||||
| import redis.clients.jedis.Jedis; | import redis.clients.jedis.Jedis; | ||||||
|  | import redis.clients.jedis.exceptions.JedisConnectionException; | ||||||
| import redis.clients.jedis.exceptions.JedisException; | import redis.clients.jedis.exceptions.JedisException; | ||||||
| 
 | 
 | ||||||
| import java.util.Calendar; | import java.util.Calendar; | ||||||
| @ -79,46 +80,44 @@ public final class UUIDTranslator { | |||||||
|         // Let's try Redis. |         // Let's try Redis. | ||||||
|         Jedis jedis = plugin.getPool().getResource(); |         Jedis jedis = plugin.getPool().getResource(); | ||||||
|         try { |         try { | ||||||
|  |             String stored = jedis.hget("uuid-cache", player.toLowerCase()); | ||||||
|  |             if (stored != null) { | ||||||
|  |                 // Found an entry value. Deserialize it. | ||||||
|  |                 CachedUUIDEntry entry = RedisBungee.getGson().fromJson(stored, CachedUUIDEntry.class); | ||||||
|  | 
 | ||||||
|  |                 // Check for expiry: | ||||||
|  |                 if (entry.expired()) { | ||||||
|  |                     jedis.hdel("uuid-cache", player.toLowerCase()); | ||||||
|  |                 } else { | ||||||
|  |                     nameToUuidMap.put(player.toLowerCase(), entry); | ||||||
|  |                     uuidToNameMap.put(entry.getUuid(), entry); | ||||||
|  |                     return entry.getUuid(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             // That didn't work. Let's ask Mojang. | ||||||
|  |             if (!expensiveLookups) | ||||||
|  |                 return null; | ||||||
|  | 
 | ||||||
|  |             Map<String, UUID> uuidMap1; | ||||||
|             try { |             try { | ||||||
|                 String stored = jedis.hget("uuid-cache", player.toLowerCase()); |                 uuidMap1 = new UUIDFetcher(Collections.singletonList(player)).call(); | ||||||
|                 if (stored != null) { |             } catch (Exception e) { | ||||||
|                     // Found an entry value. Deserialize it. |                 plugin.getLogger().log(Level.SEVERE, "Unable to fetch UUID from Mojang for " + player, e); | ||||||
|                     CachedUUIDEntry entry = RedisBungee.getGson().fromJson(stored, CachedUUIDEntry.class); |  | ||||||
| 
 |  | ||||||
|                     // Check for expiry: |  | ||||||
|                     if (entry.expired()) { |  | ||||||
|                         jedis.hdel("uuid-cache", player.toLowerCase()); |  | ||||||
|                     } else { |  | ||||||
|                         nameToUuidMap.put(player.toLowerCase(), entry); |  | ||||||
|                         uuidToNameMap.put(entry.getUuid(), entry); |  | ||||||
|                         return entry.getUuid(); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 // That didn't work. Let's ask Mojang. |  | ||||||
|                 if (!expensiveLookups) |  | ||||||
|                     return null; |  | ||||||
| 
 |  | ||||||
|                 Map<String, UUID> uuidMap1; |  | ||||||
|                 try { |  | ||||||
|                     uuidMap1 = new UUIDFetcher(Collections.singletonList(player)).call(); |  | ||||||
|                 } catch (Exception e) { |  | ||||||
|                     plugin.getLogger().log(Level.SEVERE, "Unable to fetch UUID from Mojang for " + player, e); |  | ||||||
|                     return null; |  | ||||||
|                 } |  | ||||||
|                 for (Map.Entry<String, UUID> entry : uuidMap1.entrySet()) { |  | ||||||
|                     if (entry.getKey().equalsIgnoreCase(player)) { |  | ||||||
|                         persistInfo(entry.getKey(), entry.getValue(), jedis); |  | ||||||
|                         return entry.getValue(); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } catch (JedisException e) { |  | ||||||
|                 plugin.getLogger().log(Level.SEVERE, "Unable to fetch UUID for " + player, e); |  | ||||||
|                 // Go ahead and give them what we have. |  | ||||||
|                 return null; |                 return null; | ||||||
|             } |             } | ||||||
|         } finally { |             for (Map.Entry<String, UUID> entry : uuidMap1.entrySet()) { | ||||||
|             plugin.getPool().returnResource(jedis); |                 if (entry.getKey().equalsIgnoreCase(player)) { | ||||||
|  |                     persistInfo(entry.getKey(), entry.getValue(), jedis); | ||||||
|  |                     return entry.getValue(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } catch (JedisException e) { | ||||||
|  |             plugin.getLogger().log(Level.SEVERE, "Unable to fetch UUID for " + player, e); | ||||||
|  |             if (jedis != null) | ||||||
|  |                 plugin.getPool().returnBrokenResource(jedis); | ||||||
|  |             // Go ahead and give them what we have. | ||||||
|  |             return null; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return null; // Nope, game over! |         return null; // Nope, game over! | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Tux
						Tux