Commit Graph

167 Commits

Author SHA1 Message Date
Owen1212055
32f79c415e Support paper plugin meta marking plugins as Folia supported 2023-03-29 14:12:30 -07:00
Spottedleaf
f42c61aba6 Folia Metrics page
https://bstats.org/plugin/server-implementation/Folia/18084
2023-03-29 12:53:55 -07:00
Jason Penilla
fca2eba2f8
fix build 2023-03-29 10:18:38 -07:00
Spottedleaf
7de5c541b3 Nerf default tick thread allocation
Allocates too many threads by default
2023-03-29 08:12:27 -07:00
Josh Roy
88167d59d2
Add Server#isGlobalTickThread (#5) 2023-03-28 18:59:19 -07:00
Spottedleaf
108dc2358b Use chunk coords for thread check for CraftWorld#getHighestBlockYAt
Not block coords
2023-03-28 16:13:18 -07:00
Spottedleaf
1c5e9be7fd Force prevent moving into unloaded chunks
Not safe to allow this anymore
2023-03-28 15:59:41 -07:00
Spottedleaf
d113346b6d Fix isTickThread(world, blockX, blockZ)
Need to convert the Z to chunk, not block...

Also throw for CraftPlayer#teleport and friends
2023-03-27 20:29:16 -07:00
Spottedleaf
1175350400 Fix failure to initialise CraftWorld
Directly access spawn category limits rather than go through
the method
2023-03-27 16:06:19 -07:00
Josh Roy
5fa0556869
Use longs for scheduler delays/periods (#4) 2023-03-25 21:48:28 -07:00
Spottedleaf
75e3cdbc61 Rebase fixups 2023-03-25 16:29:07 -07:00
Spottedleaf
6df8272abf Deprecate bukkit scheduler
Every method on that should basically throw, so the API should
reflect that
2023-03-25 16:27:55 -07:00
Spottedleaf
66c77fb573 Add more thread checks to API
Most of the World methods, and for updating captured TEs
2023-03-25 16:26:54 -07:00
Spottedleaf
c435aaae96 Add world checks to retrieval of regionised world data
This is to mirror behavior of RegionizedData's world check.
2023-03-25 15:27:50 -07:00
Spottedleaf
7eea12b9e4 Kenny momentos
Random newline?
2023-03-25 11:55:44 -07:00
Nassim Jahnke
3c62932250
Fix player disconnect call in PlayerList removAll 2023-03-25 19:44:11 +01:00
Nassim Jahnke
5e7b4f0185
Fix tests by removing them 2023-03-25 19:06:35 +01:00
Nassim Jahnke
836dc75b65
Replace Vector with Position in isOwnedByCurrentRegion methods
Closes #3
2023-03-25 18:50:36 +01:00
Nassim Jahnke
8d15f3e23d
Add methods taking world, chunkX, chunkZ to RegionScheduler 2023-03-25 18:40:20 +01:00
Nassim Jahnke
dfc157075a
Renames for consistency 2023-03-25 00:22:47 +01:00
Spottedleaf
6a5fff3caa Make ClickCallbackProviderImpl thread-safe
Can no longer process tasks from the main thread like that anymore,
it just needs to be concurrent.
2023-03-23 07:55:26 -07:00
Spottedleaf
d5b837c457 Make Damagecommand safe, and remove RideCommand 2023-03-23 07:36:44 -07:00
Spottedleaf
4c183bf960 Fix compile 2023-03-23 07:22:57 -07:00
Spottedleaf
c7fbdd87d2 Update to 1.19.4
Patches applied, but not yet checked compile.
2023-03-23 06:55:09 -07:00
Spottedleaf
e3a299c5ce Lowercase project names
Make JMP happy
2023-03-23 04:53:58 -07:00
Spottedleaf
50ad6c3131 New scheduler API
Now, entity/global/location schedulers implement a generic run,
runDelayed, and runAtFixedRate methods that provide a ScheduledTask
value that can be used to interact with the scheduled task.

Add also an async task scheduler that implements the same methods,
except the delays/periods are in time and not ticks, as the scheduler
is independent of the server tick process.

Additionally, throw on some unimplemented APIs now.
2023-03-23 02:51:04 -07:00
Spottedleaf
0da953539b Disable mid-tick task execution
Mid-tick task execution acquires the ticket lock at least,
which can possibly be a significant performance bottleneck
at a high tick thread + region count. This change should reduce
the impact from scaling the region threads, but is not a fix
to the underlying issue.
2023-03-20 02:48:16 -07:00
Spottedleaf
106a4affdc Suppress entire CB passenger events if the entity is not valid
The event is not being called, so the checks will not do
anything. We need to bypass the checks so that we do not trip
the thread check.
2023-03-19 17:41:24 -07:00
Spottedleaf
7e948a6179 Add global region scheduler
This will allow plugins to safely execute commands or perform
other global tick thread data modification.
2023-03-19 16:43:34 -07:00
Spottedleaf
cbf8108d4e Make max concurrent logins patch use maxJoinsPerTick config
This patch performed perfectly to handle the test server,
so it can stay.
2023-03-19 14:58:52 -07:00
Spottedleaf
0911c7a58a Remove patches specific for stream
Specifically, the /msg and /me command removal and the operator
only chat. Additionally, remove the TPA commands.
2023-03-19 14:53:06 -07:00
Spottedleaf
ee737050a0 Add thread checks for CraftEntity#getHandle
Also resolve some issues found by this change.

Currently, the player handle checks are disabled.
2023-03-19 14:48:37 -07:00
Spottedleaf
a980944815 Regionise RedStoneWireBlock#shouldSignal
Global state used to update redstone, so it should be regionised.
2023-03-12 20:55:52 -07:00
Spottedleaf
6fe75ab068 Erase mob target in getTarget if it is not in the current region
This will prevent access to the target's position or data.
2023-03-12 15:36:05 -07:00
Spottedleaf
3aeb021748 Make PoiCompetitorScan region-safe
We implement it by ensuring that if the entity is not nearby
the job site, they automatically lose.
2023-03-12 15:25:06 -07:00
Spottedleaf
cf72543628 Rebase fixups 2023-03-12 15:04:00 -07:00
Spottedleaf
a9a885ad00 Resolve concurrent access to ticket state
The concurrent access occurred in the region merge/split logic,
as it did not own the ticket lock. To resolve this, we simply
make the ticket add/remove acquire the read lock of
the region lock.
2023-03-12 15:00:38 -07:00
Spottedleaf
518b2d5dec Fix zero radius tasks being recognized as infinite
Fixes parallelism loss from spawn entity chunk status
2023-03-12 00:51:43 -08:00
Spottedleaf
0a11f6aa1f Do not execute infinite radius task in parallel when pushing tasks
By definition, it should not execute in parallel with anything.
2023-03-12 00:17:44 -08:00
Spottedleaf
3bc5341531 Make specialCaseUnload global state
With region state, it may be modified concurrently while
only holding the region lock. Need to figure out a solution
for the ticket state as well.
2023-03-11 23:28:34 -08:00
Spottedleaf
9561a53e7a Log exceptions in ThreadedRegioniser explicitly
I suspect something called these methods, they threw and then
the error was hidden by some completablefuture somewhere.
2023-03-11 12:56:43 -08:00
Spottedleaf
a80cdafae9 Make uncaught exceptions in tick thread shut down the server 2023-03-11 12:36:37 -08:00
Spottedleaf
3f2b83c35a Make SaplingBlock.treeType a thread-local
Now it is accessed concurrently
2023-03-11 06:27:35 -08:00
Spottedleaf
9e835221b9 Update new bee position before adding to beehive
This will ensure the thread check from discard does not fail
2023-03-11 06:14:05 -08:00
Spottedleaf
760de0a276 Move region center calculation into try-catch
Sometimes a region is empty, but only when the threaded regioniser
crashes. So, it should not prevent shutdown.

Additionally, only remove pending teleports after setting the
current region.
2023-03-11 05:46:20 -08:00
Spottedleaf
0fa5f339f2 Do not allow players to interact with entities outside the current region 2023-03-11 05:38:11 -08:00
Spottedleaf
d2a5acba4a Do not allow players to interact with blocks outside of their region 2023-03-11 05:16:10 -08:00
Spottedleaf
4af9f6c889 Do not allow players to destroy blocks that are not owned 2023-03-11 05:10:34 -08:00
Spottedleaf
4cffea6652 Read cancelled field while holding region lock
This will prevent a race condition where the region is cancelled
and immediately re-scheduled, and where this all happens while
the tick thread is blocking on tryMarkTicking.
2023-03-10 20:46:58 -08:00
Spottedleaf
f6d776697b Fix kicking player when they die on a vehicle with instant respawn
The respawn logic apparently can fire before the death is broadcasted
2023-03-10 20:11:08 -08:00
Spottedleaf
e1ad1b1d91 No longer give everyone access to /tps
Everyone had access to /tps for the private tests, but we cannot
trust everyone to use it responsibly for the public test
(i.e revealing coordinates of all logged in players).
2023-03-10 00:19:40 -08:00
Spottedleaf
d258d32393 Add chunk system throughput counters to /tps 2023-03-10 00:18:12 -08:00
Spottedleaf
8625606b3d Fix crash if player disconnects during login stage 2023-03-09 21:17:18 -08:00
Spottedleaf
a9d01f9b4f Max pending logins
Should help hold the floodgates on launch
2023-03-09 21:04:10 -08:00
Spottedleaf
bbee4310fe Fix fishing rods throwing exceptions
Need to move setOwner after the position update, as the thread-check
will fall back to position
2023-03-09 20:45:32 -08:00
Spottedleaf
5cbf898ca1 Stream mode
Disable chat and /msg and /me for non-ops so that the server is
safe to stream
2023-03-09 20:45:32 -08:00
Spottedleaf
950216171d Do not let projectiles travel into chunks not owned by current region
Otherwise, the thread checks for moving the entity into the new
entity chunk section would throw and cause the projectile to
be deleted.
2023-03-08 20:15:22 -08:00
Spottedleaf
ef515cc6f5 Consider non-owned chunks in entity movement as unloaded
This should prevent entities from moving into areas not owned
by the current region.
2023-03-08 19:44:01 -08:00
Spottedleaf
afd678cab6 Fall back to position check if the entity has a null entity callback
In the case that the entity has a null callback, it means the
entity has not been added to the world - so, we should treat
it the same as entity#isRemoved.
2023-03-08 19:38:50 -08:00
Spottedleaf
deae156e59 Make Level#getBlockEntity return null immediately if not tickthread
Otherwise, the world data will be null and we will NPE. The
function is supposed to return null for off-thread access,
anyways.
2023-03-08 17:40:28 -08:00
Spottedleaf
74f665b6f5 Fix compilation 2023-03-07 20:06:08 -08:00
Spottedleaf
b00a16a66d Fix command label placeholder in usage for /tps
Only <command> gets replaced with the provided label
2023-03-07 17:34:45 -08:00
Spottedleaf
68b20e0acc Add API for checking ownership of region by position/entity
This may be useful for plugins which want to perform operations
over large areas outside of the buffer zone provided by the
regionaliser, as it is not guaranteed that anything outside
of the buffer zone is owned. Then, the plugins may use
the schedulers depending on the result of the ownership
check.
2023-03-07 14:44:37 -08:00
Spottedleaf
386bcd1094 Make ServerLevel#areChunksLoadedForMove also check region ownership
We do not want players to move into chunks that are not owned
by the current region
2023-03-07 13:31:59 -08:00
Spottedleaf
0e4358fb7e Make Player#kickPlayer function asynchronously
We have made disconnect() mt-safe, so there is no need for
this check anymore.
2023-03-07 13:22:53 -08:00
Spottedleaf
7af86e656d Do not schedule keepalive fail kick to main
There is no main thread to schedule to, and I've already
make disconnect() handle off-region kicks safely.
2023-03-07 13:19:29 -08:00
Spottedleaf
99429cee37 Make plugin tickets no longer sync load the chunk
This is to prevent any thread-check from failing. Note that
ticket additions are mt-safe.

Additionally, add more thread checks.
2023-03-07 13:13:31 -08:00
Spottedleaf
2ccfc8efc0 Add RegionisedServerInitEvent
This event allows plugins to perform synchronous operations before
any region will tick. Plugins will not have to worry about the
possibility of a region ticking in parallel while listening
to the event.
2023-03-07 13:06:11 -08:00
Spottedleaf
f86bc13d22 Make tpdeny prompt show /tpadeny instead of /tpaccept
As it should be showing
2023-03-07 13:03:20 -08:00
Spottedleaf
71a4219ab6 Make sure /tps includes global region in total util percent
While we expect the util from the global region to be around 0.0,
it doesn't mean it always will be. So, include it.
2023-03-07 12:51:23 -08:00
Spottedleaf
8fcf959ee3 Fix various World chunk methods
- Add thread check for loadChunk
- Make isChunkGenerated use the region task queue to schedule
  to "main"
- Don't complete async chunk future if not in the owning thread
  for the chunk
2023-03-06 14:27:02 -08:00
Spottedleaf
7ca8feff63 Log delayed world init
Nothing ticks until this is done, so it should be logged.
2023-03-06 14:04:08 -08:00
Spottedleaf
5c4d65efb8 Require plugins to be explicitly marked as Folia supported
Plugins must add "folia-supported: true" to their plugin.yml
otherwise the server will refuse to load them.

Since Folia is a major breakage for plugins, the vast majority
of plugins will not function correctly on Folia. To prevent
user confusion from this, we will refuse to load the plugin
and provide a log indicating why - which will be much
more helpful than some random error log caused by
a breakage.
2023-03-06 14:03:17 -08:00
Spottedleaf
4e7205d401 Change entity scheduler API to use Runnables
The generics pose a problem, and the parameter passed to the
Consumer is not needed in API.

Additionally, stop trying to cancel Bukkit scheduler tasks on
plugin disable as the Bukkit scheduler does not work.
2023-03-06 12:57:29 -08:00
Spottedleaf
490b8f5182 Add logo 2023-03-06 02:43:32 -08:00
Spottedleaf
e6d60da06f Halt chunk systems before saving chunks for all worlds
This is to ensure that chunks are not progressing in other worlds
while saving
2023-03-05 12:51:23 -08:00
Spottedleaf
43d0469e36 Initial README documentation
First draft
2023-03-04 20:27:36 -08:00
Spottedleaf
282ded3b44 Add some scheduling API 2023-03-04 13:13:23 -08:00
Spottedleaf
8ffa40246a Fix NPE in treeFinished()
tryPushTasks returns null when there are no tasks, not
an empty list.
2023-03-03 16:46:03 -08:00
Spottedleaf
04b28a65ca Fix mob spawning
We should only iterate over the local region's entities, not the
global entity list to set up the spawner state, as everything else
about the spawner state (player count / chunk count) is regionised.
Additionally, move the last spawner state to regionised state so that
paper mobcaps command functions as expected.
2023-03-03 15:58:43 -08:00
Spottedleaf
f9327302d8 Make ServerLevel#onTrackingEnd map data access thread-safe
We need to synchronise on the map data object and on the
cache, as is done everywhere else for access of such data
2023-03-02 23:39:55 -08:00
Spottedleaf
bb3f8a4aea Process player chunk loader mid tick at the start of tick
Additionally, process ticket updates as well if either
the mid tick logic did anything or whether we processed
any chunk tasks.

We process the mid tick logic at the start to be consistent
with the inbetween task execution logic (which is not implemented),
and we process ticket updates to ensure that any full status changes
are processed from chunk tasks.
2023-03-02 23:31:59 -08:00
Spottedleaf
b42537ed02 Cache whether region files do not exist
The repeated I/O of creating the directory for the regionfile
or for checking if the file exists can be heavy in
when pushing chunk generation extremely hard - as each chunk gen
request may effectively go through to the I/O thread.
2023-03-02 23:26:47 -08:00
Spottedleaf
bc07c9f31f Fix radius aware executor softlock
The softlock would occur when a dependency tree finished executing
all of its task and searched for the highest dependency tree
to queue tasks from, only to have that such tree be filled
with purged tasks. Because it would select an empty
tree to pull tasks from, it would not select another
tree to execute tasks from as this logic is done after a task
is executed.
2023-03-01 22:22:24 -08:00
Spottedleaf
9443d3ad35 Only attempt to respawn/cancel ender dragon if current region owns 0,0
The only tick thread allowed to touch the dragon fight state is
the one that owns 0,0
2023-03-01 20:10:34 -08:00
Spottedleaf
ac079d0691 Use Folia repo in version checker
Want this to work after it goes public
2023-03-01 19:16:40 -08:00
Spottedleaf
093b1e5394 Fix several issues, mostly saving pending teleporting entities
The place/portal async function now track entities that have been
removed from the world but have not teleported. When the server
shuts down, these entities will have their passenger tree restored
and re-added to the entity slices at the location they were teleporting to,
or in the case of portals that did not run placeAsync yet,
the location they entered the portal on. This should ensure that
for regular teleports that the entity is placed at its correct
target location, and for portalling to ensure that either
the entity is placed at the portal entrace location (where
they entered) or the portal destination. In any case,
the entity is preserved in a location and will survive
the shutdown.

Additionally, move player saving until after the worlds save. This
is to ensure that the save logic is performed only after
all teleportations have completed.

Fix some other misc issues as well:
 - Fix double nether portal creation by checking if a portal exists again
   before creating it, fixing a race condition where two entites would portal
   and neither would see that the other created a portal.
 - Make all remove ticket add an unknown ticket.
   In general this behavior is better since it means that unloads will only
   ever occur at the next tick, rather than during the tick logic. Thus,
   there will be no cases where a chunk is unloaded unexpectedly.
 - Do not use fastFloor for calculating chunk position from block position
   It is not going to return a good value outside of [-1024, 1024]
 - Always perform mid tick update for ticking regionised player chunk loader
   If no entities were loaded, no chunks were loaded, and nothing else -
   the logic would not have otherwise ran. This fixed some rare cases of
   chunks never loading for players after logging in.
2023-03-01 19:12:31 -08:00
Spottedleaf
85c9fb622a Improve thread-safety of ownsRaid
It should null check the position and retrieve it only once.
2023-02-28 06:41:08 -08:00
Spottedleaf
30d90b4700 Make raids thread-safe
We don't need to worry about synchronisation for saving data,
as that is currently only done by the shutdown thread - after
all regions stop ticking.
2023-02-28 06:33:34 -08:00
Spottedleaf
36675a1b9f Make map data thread-safe to access
We can just synchronise on all of the map data accesses, but
this means we need to be careful about ensuring that no
sync loads occur, otherwise we could block other threads for
long periods of time.
2023-02-27 08:37:47 -08:00
Spottedleaf
19fd3efaa6 Increase parallelism for neighbour writing chunk statuses
Namely, everything after FEATURES. By creating a dependency
chain indicating what chunks are in use, we can safely
schedule completely independent tasks in parallel. This
will allow the chunk system to scale beyond 10 threads
per world.

Currently this patch needs some more testing.
2023-02-26 23:45:21 -08:00
Spottedleaf
5a4351d3b6 Improve thread-safety of combat tracker
The simple solution is that we ignore entities/positions that are not
in the current region. Making retrieval of items in inventory
thread-safe is not going to happen.
2023-02-24 00:23:10 -08:00
Spottedleaf
9b824e6406 Fix player chunk loader behaving poorly when limits are low
Need to use ceil() so that it always allows at least 1 addition
for the 50ms case.
2023-02-24 00:03:00 -08:00
Spottedleaf
b772012778 Make the StructureCheck class MT-Safe
This is so that it may be accessed concurrently
from many regions.

Additionally, make sure it does not leak memory by limiting
the number of entries it will cache.
2023-02-23 23:35:30 -08:00
Spottedleaf
6d922d4b48 Implement player sleep status / night skip
Now, all of the sleep status changes are pushed to the global
tick thread. Had to modify the wake up all players routine
to use the task scheduler to ensure the player is woken up
on the right region context.

Fix erroring while crashing on the global tick thread due to
region field being null.
2023-02-23 20:48:49 -08:00
Spottedleaf
f7e2fe2267 Force disable timings
Need a new profiler system with region threading
2023-02-23 20:13:44 -08:00
Spottedleaf
2474482685 Remove the remains of per-player mob spawns
Now, the spawning should be running Vanilla logic; except
that it is calculated per region (which is what per player
was effectively achieving anyways).
2023-02-23 20:07:56 -08:00
Spottedleaf
256f68d149 Regionise skip hopper event fields 2023-02-23 19:34:00 -08:00
Spottedleaf
fd7901d0f1 Implement TPA system for test server
Will be removed later once this is all public.

Fixed many issues with teleporting players on vehicles
while in the same region.

Additionaly, make sure dead players are dismounted - as
this logic was previously done by remove.

Re-add regiontodo.txt
2023-02-23 18:42:20 -08:00
Spottedleaf
fa05f7830c Implement BlockEntity#updateTicks
Because game time is now on the global tick thread, we no longer
need adjustments for any block entity. But, just in case we do
updateTicks functions now.
2023-02-23 12:52:39 -08:00