JoinGG

Finding the plugin conflict, without losing the evening

A server that worked yesterday and does not today is usually two plugins disagreeing. The bisect works — in the right order, on a copy.

SweetMask · 5 min read

A server that worked yesterday and does not today, with no change you made, is usually two plugins that have started disagreeing. Finding which two is a mechanical process, and doing it in the wrong order costs an evening.

Why conflicts happen without you changing anything

Plugins update on their authors' schedules. A server that pulls updates automatically, or an operator who updated one thing on Tuesday, has a different combination running than it did on Monday.

They also conflict situationally. Two plugins that both handle player teleportation coexist fine until somebody teleports while riding a horse, and then one of them throws an error that the other never expected. That conflict was always there; it needed a specific event to surface.

The practical consequence: "I did not change anything" is usually true and almost never means nothing changed.

Read the log before touching anything

The first stack trace is worth more than an hour of guessing. Server logs name the plugin in the trace, and the plugin named is usually — not always — involved.

Two things to look for:

The first error after startup, not the loudest one. Cascading failures are common: one plugin fails to initialise, and six others log errors because a service they expected is missing. The sixth error is noise; the first is the cause.

Caused by: lines. They are the actual origin, and they are frequently further down than the part people copy into a support channel.

If the log names a class from a plugin you have never heard of, that is often a shaded library rather than the plugin itself — two plugins bundling different versions of the same dependency is a classic and infuriating conflict.

The bisect, done properly

When the log does not name a culprit, you halve.

  1. Move every plugin to a folder outside the server
  2. Restart, confirm the problem is gone — if it is not, it was never a plugin
  3. Move half back, restart, test
  4. If the problem returns, the culprit is in that half; if not, it is in the other
  5. Repeat with the failing half

With thirty plugins that is five restarts, not thirty. The failure people make is adding them back one at a time, which is thirty restarts and considerably more temptation to give up halfway.

Test the actual symptom each time. Bisecting against "does the server start" when the problem is "teleporting breaks" finds nothing, because the server starts either way.

Do it somewhere that is not production

This is the part that gets skipped, and it is the part that makes the process survivable.

A copy of the server, on the same version, with the same plugins and a copy of the world, costs nothing to run for an afternoon. Bisecting on a live server means every restart is an outage, which means you rush, which means you skip a step and have to start again.

If you run containers this is close to free — a second instance from the same image with a copy of the volume. If you do not, it is still worth a temporary machine for a day.

Common conflict shapes

ShapeSymptom
Two plugins claiming the same commandOne silently stops working
Two economy or permissions pluginsValues reset, or apply inconsistently
Shaded library version clashErrors naming a class in neither plugin
Event priority disagreementAn action is cancelled and then uncancelled
One plugin expecting an older APIStartup failure after a server update

The last one is not really a conflict — it is a plugin that has not been updated for the server version — and it is the most common single cause after a version bump. Checking every plugin's supported version before updating the server is dull and prevents most of this category.

Prevention that actually works

Fewer plugins. Every addition is another pair. Ten plugins have forty-five possible pairs; thirty have four hundred and thirty-five. This is the real argument for restraint, and it is the same argument as keeping the Workshop set small.

Pin versions. Automatic updates are how a working server becomes a broken one overnight. Update deliberately, one thing at a time, and know what changed.

Keep a known-good copy of the plugin folder. Not a backup of the world — a copy of the plugins directory, taken when everything worked, so you can compare rather than remember.

Write down why each plugin is there. In six months you will find one you cannot account for, and the choice between removing something load-bearing and keeping something useless is easier with a note than without.

One more source worth ruling out early: a plugin that is fine and a server version that moved under it. After a game update the first suspects are the plugins that have not shipped a compatible build, which is its own diagnostic rather than a conflict between two of them — check each plugin's stated compatibility before assuming two of them disagree, and check the branch the server is pinned to before that.

When the answer is "remove one"

Sometimes two plugins genuinely cannot coexist and neither author is going to change it. At that point you are choosing, and the criteria worth applying:

  • Which one do players actually use? Not which one you like configuring
  • Which one is maintained? An unmaintained plugin is a future conflict regardless
  • Which one has an alternative? Replacing one of two conflicting plugins is often easier than reconciling them

An unmaintained plugin that conflicts today will conflict harder at the next game update. Removing it now is cheaper than removing it during an incident.

What to tell players

Something. A server that is broken and silent reads as abandoned, and that impression is expensive to reverse. "Teleport is broken, we know, we are bisecting plugins" costs one message and buys the patience to actually fix it.

The corollary is not to promise a timeline. Conflicts resolve in twenty minutes or three days and you genuinely do not know which at the start.

The short version

Read the first error, not the loudest. Bisect by halves on a copy of the server, testing the real symptom each time. Expect the cause to be an update you did not make or a combination that needed a specific event to surface.

And keep the plugin count low, because the number of things that can disagree grows faster than the number of things you installed.

Tags
pluginstroubleshootingserver admin
Share

SweetMask

Published · 5 min read

All articles

Keep reading

Guides

Whitelisting, and who it keeps out

The most effective moderation tool and the most expensive one. The cost is your growth rate, and nobody evaluates that part.

· 3 min read
Guides

Running several game servers on one box

They cannot see each other and they are competing. CPU contention, the memory arithmetic, and the port map nobody writes down.

· 4 min read
Guides

Reading server logs without drowning

Four categories, two that need you. Start at the top rather than the bottom, and learn what a quiet log looks like.

· 4 min read