Skip to content
Select theme
  • Auto
  • Dark
  • Light
Download

Why Oasis

There are plenty of block logging plugins. We built another one because none of them could handle our own server. Here’s what that gives you, even if your server is nothing like ours.

A lag-free server, even on free-op and anarchy servers

Section titled “A lag-free server, even on free-op and anarchy servers”

Oasis started on an anarchy server. Players there get FastAsyncWorldEdit with full permissions, and some of them use it to change a hundred million blocks or more in one go, just because they can.

Most servers deal with that in one of two ways. They keep a long list of banned blocks, or they cap WorldEdit so hard that it’s barely worth using. Both punish everyone for what a few people might do. We didn’t want either, so we built a logger that keeps up instead.

It does. On that server, Oasis rolled back 252 million WorldEdit changes in under a minute, and the players kept playing the whole time. Oasis does a rollback in small pieces between the game’s ticks, so the server never stops for it.

Your server will likely never see a grief that big, and that’s the point. If Oasis stays calm under that kind of load, a normal day on a normal server barely registers. Your players get a server that doesn’t lag, and your staff get rollbacks that finish quickly.

Shameless plug: that server is TotalFreedom. Come see Oasis under real load.

Say Steve pours lava on a forest. The lava sets the trees on fire, the fire spreads, and the leaves decay. With Oasis, a moderator types one line:

/rb user Steve last 1h

That puts back everything Steve started: the lava, the fire, the burned trees, the leaves and the torches that fell.

With CoreProtect, the same grief takes this:

/co rb u:Steve,#lava,#fire,#decay t:1h r:100

CoreProtect writes the fire down as #fire and the leaves as #decay. Lava keeps Steve’s name for about half a minute, and after that CoreProtect writes it down as #lava. So the moderator has to know each of those names and add them by hand. They also have to stand in the middle of the damage, because a rollback can only reach 100 blocks. And those names aren’t Steve’s, so the rollback also undoes every other fire and lava flow in that area from the last hour.

With Oasis, nobody has to learn any of that. Every command uses the same handful of plain words, like user, last, near and block, and you can write them in any order.

You don’t have to remember them either. Press Tab and Oasis lists every word that fits, each with a short hint about what it does. Pick one, press Tab again, and Oasis suggests values: recent players, time spans, distances, block names. Make a typo and Oasis tells you what you probably meant.

An interactive command builder. It starts empty. Pick /lookup, /rollback or /rs (restore), then add filter words such as user, last, near, block and cause, and pick a value for each. You can change or remove each part of the command, and a plain sentence says what the command does. Several values of one word, such as two players, join with a comma. For example, /rollback user Steve last 1d not cause worldedit rolls back everything Steve did in the last 24 hours, except WorldEdit changes.

Pick a command below

Pick a command to start.

Start with what you want to do

Build a real Oasis command one word at a time, then paste it in game.

Most logging plugins write down what happened. A block burned. Lava flowed. An arrow flew out of a dispenser. What they can’t tell you is who started it, so when a griefer sets a forest on fire, the log just says “fire”, and there’s nobody to roll back.

Oasis follows each change back to the person behind it. When a player pours lava, Oasis remembers it’s their lava. When that lava lights a tree, the fire is theirs too, and so is every block it burns, every leaf that decays and every torch that drops when its wall goes. So one rollback of that player puts the whole forest back, however long the fire burned. A fire that started by itself, from lightning say, stays a natural fire and belongs to nobody.

Plants work the same way. When a player grows a jungle tree with bone meal, the vines that grow down from it later are theirs too, and so is the sugar cane that grows on cane they planted. A rollback of that player takes the tree and everything that grew from it. Vines and cane that grow wild belong to nobody.

Steve pours lava. The lava lights a fire, and the fire burns a tree, makes leaves decay and drops a torch. In Oasis, every one of those changes is marked as Steve's, so one rollback of Steve puts the whole forest back. A fire started by lightning stays a natural fire and belongs to nobody. In CoreProtect, the same changes are marked #lava, #fire and #decay, not Steve, so staff must add each of those names to the rollback by hand.

Oasis

  1. Steve
  2. His lavaSteve
  3. The fire it litSteve
    • A burned treeSteve
    • Leaves that decayedSteve
    • A torch that droppedSteve

One rollback of Steve puts the whole forest back.

Oasis, when no one starts it

  1. Lightning
  2. A firenobody

A fire that started by itself stays a natural fire and belongs to nobody.

CoreProtect

  1. Steve
  2. His lava#lava
  3. The fire it lit#fire
    • A burned tree#fire
    • Leaves that decayed#decay
    • A torch that dropped#fire

Lava keeps Steve's name for about half a minute. After that, the log names #lava, #fire and #decay, not Steve, so staff must add each name to the rollback by hand.

Oasis follows each change back to the person who started it.

Picture this. Maple builds a brick wall. Vex comes along and blows a hole in it. Before staff get to it, Juniper turns the hole into a doorway and hangs a door. Now a staff member rolls back Vex.

A simple rollback puts back exactly what Vex destroyed, so bricks go right back where Juniper’s door is, and Juniper’s work is gone.

Oasis keeps a full timeline for every block, so it can see that Juniper changed that spot after Vex did. It fills in the rest of the hole, leaves Juniper’s door alone, and tells you how many blocks it kept. If you really do want those rolled back too, one click does it. That makes a rollback much harder to get wrong, even for staff who are new to it.

Maple builds a brick wall. Vex blows a hole in it. Juniper turns the hole into a doorway and hangs a door. Staff run /rollback user Vex. A simple rollback puts back exactly what Vex destroyed, so bricks go right back where Juniper's door is, and Juniper's door is lost. Oasis fills in the rest of the hole, leaves the door, and says 2 blocks kept, because a door is two blocks tall. Typing /oa force rolls those back too.

  1. Maple

    builds a brick wall.

  2. Vex

    blows a hole in it.

  3. Juniper

    turns the hole into a doorway and hangs a door.

  4. Staff: /rollback user Vex

A simple rollback

Bricks go right back where Juniper's door is.

Juniper's door is lost

Oasis

Fills in the rest of the hole and leaves the door alone.

2 blocks kept

Roll them back too: /oa force

Oasis sees that Juniper changed the wall after Vex, and keeps the door.

History that stays small and never expires

Section titled “History that stays small and never expires”

Oasis keeps your history small, so you can keep all of it. Nothing gets deleted after a set time. A grief from last year rolls back as easily as one from last night, and old history only goes when you choose to remove it with /oasis purge.

We wrote our own storage for exactly this. It runs inside your server out of the box, so there’s nothing else to install or look after.

Oasis is free and open source. The plugin is licensed under the AGPLv3, and the API other plugins build on is under Apache 2.0. There’s no paid edition, no supporter build and no donation wall.

That last part matters to us. Some logging plugins keep their newest builds for people who pay a monthly subscription, and their free edition stays a full Minecraft version behind. You can compile the latest code yourself, but you shouldn’t have to just to keep your server’s logger working on the version your players are on. Honestly, it’s one of the reasons we started Oasis. We’ll never put an Oasis update behind a subscription, a donation tier or a supporter build. Whatever we release, everyone gets.

Under Oasis is Packs, a storage engine we wrote for one job: rollbacks.

Earlier versions of Oasis kept their history in ClickHouse. ClickHouse is an excellent analytical database. It holds billions of rows and finds any of them fast, far faster than MySQL. If a logger only stores edits and looks them up, ClickHouse is a strong choice.

A rollback asks a harder question. Finding the edits is the easy part. The rollback must work out the correct state of every block it touches, across millions of blocks, while other players keep building on top. That question does not fit a column store.

To make it fit, Oasis did much of the work itself before a row reached ClickHouse. It sorted the rows, packed them, and kept its own write-ahead log. It also stored a second copy of every row in a different sort order, so a rollback could find its rows. At rollback time, it sent large, complex queries to rebuild what each block looked like before the grief.

At that point, Oasis held most of a database of its own, so we finished the job. Packs stores history in the order a rollback reads it: one timeline for each block. A rollback reads that timeline straight off the disk, with no reconstruction step. The format is also compact, and a large WorldEdit fill takes almost nothing.

Two pipelines. Before: ClickHouse: The server, then Oasis sorts and packs rows, then Oasis keeps its own safety log, then Ships to ClickHouse, then ClickHouse keeps a second copy in a different order, then At rollback: big, complicated questions to rebuild each block's story. Now: Packs: The server, then Packs stores one timeline per block, then At rollback: read the timeline straight off the disk. The first is long and busy; the second is short and direct.

Before: ClickHouse

  1. The server
  2. Oasis sorts and packs rows
  3. Oasis keeps its own safety log
  4. Ships to ClickHouse
  5. ClickHouse keeps a second copy in a different order
  6. At rollback: big, complicated questions to rebuild each block's story

Now: Packs

  1. The server
  2. Packs stores one timeline per block
  3. At rollback: read the timeline straight off the disk
Packs stores history the way a rollback reads it.

Packs runs inside the Minecraft server by default. A server owner can also run it as a separate process, Packs Server. See Embedded or Packs Server?

Oasis is free, and it’s a single jar with nothing else to install. The install guide gets you running in a couple of minutes.