Minecraft server list displays "Can't connect to server" on startup
The bug
Whenever I start my game and go onto the Multiplayer server list, the servers all say "Can't connect to server" but when I refresh the page, it says the normal servers MOTD in the listing.
Code analysis (MCP names), comments, and additional note by Kyle Repinski
I've analyzed the issue and found it's a race condition with the multi-threaded server pinger code. The server pinging code (net.minecraft.client.network.ServerPinger) is run in multiple threads, and each thread calls net.minecraft.network.NetworkManager.createNetworkManagerAndConnect(). This function uses "lazy loaders" (net.minecraft.util.LazyLoadBase) to initialize some static variables. The issue lies in net.minecraft.util.LazyLoadBase.getValue(). This function is not thread-safe. Below you'll find the code in question with comments explaining exactly what is happening and how to fix it.
package net.minecraft.util; public abstract class LazyLoadBase<T> { private T value; private boolean isLoaded; public T getValue() // NOT THREAD-SAFE. SIMPLE FIX: declare the method synchronized { if (!this.isLoaded) // Thread 1: Condition is true; Thread 2: Condition is false { this.isLoaded = true; // Thread 1: SETS isLoaded to true, BUT VALUE IS STILL NULL this.value = this.load(); } return this.value; // Thread 2: RETURNS NULL because this.load() is not finished in Thread 1 } protected abstract T load(); }
Note that depending on the speed of the computer, this bug might not occur. If the first thread finishes quickly enough everything will appear normal.
2014-10-18, 12:41 AM
2018-06-04, 12:10 PM
2018-01-10, 07:09 PM
12
8