Skip to content

Commit

Permalink
refactor: change default sync mode to LOCKSTEP
Browse files Browse the repository at this point in the history
  • Loading branch information
WiIIiam278 committed Dec 21, 2023
1 parent 33c2eb2 commit 9cf6d1e
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -147,10 +147,10 @@ public class Settings {


// Synchronization settings
@YamlComment("The mode of data synchronization to use (DELAY or LOCKSTEP). DELAY should be fine for most networks."
@YamlComment("The data synchronization mode to use (LOCKSTEP or DELAY). LOCKSTEP is recommended for most networks."
+ " Docs: https://william278.net/docs/husksync/sync-modes")
@YamlKey("synchronization.mode")
private DataSyncer.Mode syncMode = DataSyncer.Mode.DELAY;
private DataSyncer.Mode syncMode = DataSyncer.Mode.LOCKSTEP;

@YamlComment("The number of data snapshot backups that should be kept at once per user")
@YamlKey("synchronization.max_user_data_snapshots")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,8 @@ protected void listenForRedisData(@NotNull OnlineUser user, @NotNull Supplier<Bo
* @since 3.1
*/
public enum Mode {
DELAY(DelayDataSyncer::new),
LOCKSTEP(LockstepDataSyncer::new);
LOCKSTEP(LockstepDataSyncer::new),
DELAY(DelayDataSyncer::new);

private final Function<HuskSync, ? extends DataSyncer> supplier;

Expand Down
4 changes: 2 additions & 2 deletions docs/Config-File.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ redis:
password: ''
use_ssl: false
synchronization:
# The mode of data synchronization to use (DELAY or LOCKSTEP). DELAY should be fine for most networks. Docs: https://william278.net/docs/husksync/sync-modes
mode: DELAY
# The data synchronization mode to use (LOCKSTEP or DELAY). LOCKSTEP is recommended for most networks. Docs: https://william278.net/docs/husksync/sync-modes
mode: LOCKSTEP
# The number of data snapshot backups that should be kept at once per user
max_user_data_snapshots: 16
# Number of hours between new snapshots being saved as backups (Use "0" to backup all snapshots)
Expand Down
32 changes: 16 additions & 16 deletions docs/Sync-Modes.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ HuskSync offers two built-in **synchronization modes** that utilise Redis and My
![Overall architecture of the synchronisation systems](https://raw.githubusercontent.com/WiIIiam278/HuskSync/master/images/system-diagram.png)

## Available Modes
* The `DELAY` sync mode is the default sync mode, that use the `network_latency_miliseconds` value to apply a delay before listening to Redis data
* The `LOCKSTEP` sync mode uses a data checkout system to ensure that all servers are in sync regardless of network latency or tick rate fluctuations. This mode was introduced in HuskSync v3.1
* The `LOCKSTEP` sync mode is the default sync mode. It uses a data checkout system to ensure that all servers are in sync regardless of network latency or tick rate fluctuations. This mode was introduced in HuskSync v3.1
* The `DELAY` sync mode uses the `network_latency_miliseconds` value to apply a delay before listening to Redis data

You can change which sync mode you are using by editing the `sync_mode` setting under `synchronization` in `config.yml`.

Expand All @@ -15,11 +15,22 @@ You can change which sync mode you are using by editing the `sync_mode` setting

```yaml
synchronization:
# The mode of data synchronization to use (DELAY or LOCKSTEP). DELAY should be fine for most networks. Docs: https://william278.net/docs/husksync/sync-modes
mode: DELAY
# The data synchronization mode to use (LOCKSTEP or DELAY). LOCKSTEP is recommended for most networks. Docs: https://william278.net/docs/husksync/sync-modes
mode: LOCKSTEP
```
</details>
## Lockstep
The `LOCKSTEP` sync mode works as described below:
* When a user connects to a server, the server will continuously asynchronously check if a `DATA_CHECKOUT` key is present.
* If, or when, the key is not present, the plugin will set a new `DATA_CHECKOUT` key.
* After this, the plugin will check Redis for the presence of a `DATA_UPDATE` key.
* If a `DATA_UPDATE` key is present, the user's data will be set from the snapshot deserialized from Redis contained within that key.
* Otherwise, their data will be pulled from the database.
* When a user disconnects from a server, their data is serialized and set to Redis with a `DATA_UPDATE` key. After this key has been set, the user's current `DATA_CHECKOUT` key will be removed from Redis.

Additionally, note that `DATA_CHECKOUT` keys are set with the server ID of the server which "checked out" the data (taken from the `server.yml` config file). On both shutdown and startup, the plugin will clear all `DATA_CHECKOUT` keys for the current server ID (to prevent stale keys in the event of a server crash for instance)

## Delay
The `DELAY` sync mode works as described below:
* When a user disconnects from a server, a `SERVER_SWITCH` key is immediately set on Redis, followed by a `DATA_UPDATE` key which contains the user's packed and serialized Data Snapshot.
Expand All @@ -31,15 +42,4 @@ The `DELAY` sync mode works as described below:

`DELAY` has been the default sync mode since HuskSync v2.0. In HuskSync v3.1, `LOCKSTEP` was introduced. Since the delay mode has been tested and deployed for the longest, it is still the default, though note this may change in the future.

However, if your network has a fluctuating tick rate or significant latency (especially if you have servers on different hardware/locations), you may wish to use `LOCKSTEP` instead for a more reliable sync system.

## Lockstep
The `LOCKSTEP` sync mode works as described below:
* When a user connects to a server, the server will continuously asynchronously check if a `DATA_CHECKOUT` key is present.
* If, or when, the key is not present, the plugin will set a new `DATA_CHECKOUT` key.
* After this, the plugin will check Redis for the presence of a `DATA_UPDATE` key.
* If a `DATA_UPDATE` key is present, the user's data will be set from the snapshot deserialized from Redis contained within that key.
* Otherwise, their data will be pulled from the database.
* When a user disconnects from a server, their data is serialized and set to Redis with a `DATA_UPDATE` key. After this key has been set, the user's current `DATA_CHECKOUT` key will be removed from Redis.

Additionally, note that `DATA_CHECKOUT` keys are set with the server ID of the server which "checked out" the data (taken from the `server.yml` config file). On both shutdown and startup, the plugin will clear all `DATA_CHECKOUT` keys for the current server ID (to prevent stale keys in the event of a server crash for instance)
However, if your network has a fluctuating tick rate or significant latency (especially if you have servers on different hardware/locations), you may wish to use `LOCKSTEP` instead for a more reliable sync system.

0 comments on commit 9cf6d1e

Please sign in to comment.