Mojira Archive
MC-73207

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.

Fixed

SpongerDanger

2014-10-18, 12:41 AM

2018-06-04, 12:10 PM

2018-01-10, 07:09 PM

12

8

Confirmed

multiplayer, server-list

Minecraft 1.8 - Minecraft 17w50aMinecraft 1.8, Minecraft 1.9, Minecraft 1.10.2, Minecraft 16w41a, Minecraft 16w42a, Minecraft 1.11.2, Minecraft 1.12.2, Minecraft 17w50a

Minecraft 18w02a