Fix nickname cache call blocking server thread

This commit is contained in:
Rsl1122 2019-02-21 21:24:20 +02:00
parent 82fbbb5209
commit 8caa8350ca
7 changed files with 37 additions and 49 deletions

View File

@ -76,12 +76,9 @@ public class ChatListener implements Listener {
UUID uuid = player.getUniqueId();
String displayName = player.getDisplayName();
if (displayName.equals(nicknameCache.getDisplayName(uuid))) {
return;
}
dbSystem.getDatabase().executeTransaction(
new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverInfo.getServerUUID()))
);
dbSystem.getDatabase().executeTransaction(new NicknameStoreTransaction(
uuid, new Nickname(displayName, time, serverInfo.getServerUUID()),
(playerUUID, name) -> name.equals(nicknameCache.getDisplayName(playerUUID))
));
}
}

View File

@ -167,11 +167,10 @@ public class PlayerOnlineListener implements Listener {
sessionCache.cacheSession(uuid, new Session(uuid, serverUUID, time, world, gm))
.ifPresent(previousSession -> database.executeTransaction(new SessionEndTransaction(previousSession)));
if (!displayName.equals(nicknameCache.getDisplayName(uuid))) {
database.executeTransaction(
new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverUUID))
);
}
database.executeTransaction(new NicknameStoreTransaction(
uuid, new Nickname(displayName, time, serverUUID),
(playerUUID, name) -> name.equals(nicknameCache.getDisplayName(playerUUID))
));
processing.submitNonCritical(processors.info().playerPageUpdateProcessor(uuid));

View File

@ -21,6 +21,7 @@ import com.djrapitops.plan.db.access.queries.DataStoreQueries;
import com.djrapitops.plan.db.access.transactions.Transaction;
import java.util.UUID;
import java.util.function.BiPredicate;
/**
* Transaction to store player's nickname information in the database.
@ -31,10 +32,17 @@ public class NicknameStoreTransaction extends Transaction {
private final UUID playerUUID;
private final Nickname nickname;
private final BiPredicate<UUID, String> isNicknameCachedCheck;
public NicknameStoreTransaction(UUID playerUUID, Nickname nickname) {
public NicknameStoreTransaction(UUID playerUUID, Nickname nickname, BiPredicate<UUID, String> isNicknameCachedCheck) {
this.playerUUID = playerUUID;
this.nickname = nickname;
this.isNicknameCachedCheck = isNicknameCachedCheck;
}
@Override
protected boolean shouldBeExecuted() {
return !isNicknameCachedCheck.test(playerUUID, nickname.getName());
}
@Override

View File

@ -68,18 +68,6 @@ public class NicknameCache implements SubSystem {
displayNames.clear();
}
/**
* Used to update PlayerName and DisplayName caches.
*
* @param uuid UUID of the player.
* @param displayName DisplayName of the player.
*/
public void updateDisplayName(UUID uuid, String displayName) {
if (displayName != null) {
displayNames.put(uuid, displayName);
}
}
public void removeDisplayName(UUID uuid) {
displayNames.remove(uuid);
}

View File

@ -259,8 +259,8 @@ public abstract class CommonDBTest {
saveUserOne();
Nickname expected = new Nickname("TestNickname", System.currentTimeMillis(), serverUUID);
db.executeTransaction(new NicknameStoreTransaction(playerUUID, expected));
db.executeTransaction(new NicknameStoreTransaction(playerUUID, expected));
db.executeTransaction(new NicknameStoreTransaction(playerUUID, expected, (uuid, name) -> false /* Not cached */));
db.executeTransaction(new NicknameStoreTransaction(playerUUID, expected, (uuid, name) -> true /* Cached */));
commitTest();
List<Nickname> nicknames = db.query(NicknameQueries.fetchNicknameDataOfPlayer(playerUUID));
@ -472,7 +472,7 @@ public abstract class CommonDBTest {
session.setPlayerKills(createKills());
execute(DataStoreQueries.storeSession(session));
db.executeTransaction(new NicknameStoreTransaction(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID)));
db.executeTransaction(new NicknameStoreTransaction(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID), (uuid, name) -> false /* Not cached */));
saveGeoInfo(playerUUID, new GeoInfo("1.2.3.4", "TestLoc", 223456789L, "3"));
assertTrue(db.query(PlayerFetchQueries.isPlayerRegistered(playerUUID)));
@ -522,7 +522,7 @@ public abstract class CommonDBTest {
execute(DataStoreQueries.storeSession(session));
db.executeTransaction(
new NicknameStoreTransaction(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID))
new NicknameStoreTransaction(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID), (uuid, name) -> false /* Not cached */)
);
saveGeoInfo(playerUUID, new GeoInfo("1.2.3.4", "TestLoc", 223456789L,
new SHA256Hash("1.2.3.4").create()));
@ -953,8 +953,8 @@ public abstract class CommonDBTest {
db.executeTransaction(new PlayerRegisterTransaction(playerUUID, () -> 1L, "Not random"));
String nickname = "2" + RandomData.randomString(10);
db.executeTransaction(new NicknameStoreTransaction(uuid, new Nickname(nickname, System.currentTimeMillis(), serverUUID)));
db.executeTransaction(new NicknameStoreTransaction(playerUUID, new Nickname("No nick", System.currentTimeMillis(), serverUUID)));
db.executeTransaction(new NicknameStoreTransaction(uuid, new Nickname(nickname, System.currentTimeMillis(), serverUUID), (u, name) -> false /* Not cached */));
db.executeTransaction(new NicknameStoreTransaction(playerUUID, new Nickname("No nick", System.currentTimeMillis(), serverUUID), (u, name) -> true /* Cached */));
String searchFor = "2";

View File

@ -75,12 +75,9 @@ public class SpongeChatListener {
UUID uuid = player.getUniqueId();
String displayName = player.getDisplayNameData().displayName().get().toPlain();
if (displayName.equals(nicknameCache.getDisplayName(uuid))) {
return;
}
dbSystem.getDatabase().executeTransaction(
new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverInfo.getServerUUID()))
);
dbSystem.getDatabase().executeTransaction(new NicknameStoreTransaction(
uuid, new Nickname(displayName, time, serverInfo.getServerUUID()),
(playerUUID, name) -> name.equals(nicknameCache.getDisplayName(playerUUID))
));
}
}

View File

@ -142,11 +142,11 @@ public class SpongePlayerListener {
private void actOnJoinEvent(ClientConnectionEvent.Join event) {
Player player = event.getTargetEntity();
UUID playerUUID = player.getUniqueId();
UUID uuid = player.getUniqueId();
UUID serverUUID = serverInfo.getServerUUID();
long time = System.currentTimeMillis();
SpongeAFKListener.AFK_TRACKER.performedAction(playerUUID, time);
SpongeAFKListener.AFK_TRACKER.performedAction(uuid, time);
String world = player.getWorld().getName();
Optional<GameMode> gameMode = player.getGameModeData().get(Keys.GAME_MODE);
@ -163,21 +163,20 @@ public class SpongePlayerListener {
boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS);
if (gatheringGeolocations) {
database.executeTransaction(
new GeoInfoStoreTransaction(playerUUID, address, time, geolocationCache::getCountry)
new GeoInfoStoreTransaction(uuid, address, time, geolocationCache::getCountry)
);
}
database.executeTransaction(new PlayerServerRegisterTransaction(playerUUID, () -> time, playerName, serverUUID));
sessionCache.cacheSession(playerUUID, new Session(playerUUID, serverUUID, time, world, gm))
database.executeTransaction(new PlayerServerRegisterTransaction(uuid, () -> time, playerName, serverUUID));
sessionCache.cacheSession(uuid, new Session(uuid, serverUUID, time, world, gm))
.ifPresent(previousSession -> database.executeTransaction(new SessionEndTransaction(previousSession)));
if (!displayName.equals(nicknameCache.getDisplayName(playerUUID))) {
database.executeTransaction(
new NicknameStoreTransaction(playerUUID, new Nickname(displayName, time, serverUUID))
);
}
database.executeTransaction(new NicknameStoreTransaction(
uuid, new Nickname(displayName, time, serverUUID),
(playerUUID, name) -> name.equals(nicknameCache.getDisplayName(playerUUID))
));
processing.submitNonCritical(processors.info().playerPageUpdateProcessor(playerUUID));
processing.submitNonCritical(processors.info().playerPageUpdateProcessor(uuid));
}
@Listener(order = Order.POST)