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(); UUID uuid = player.getUniqueId();
String displayName = player.getDisplayName(); String displayName = player.getDisplayName();
if (displayName.equals(nicknameCache.getDisplayName(uuid))) { dbSystem.getDatabase().executeTransaction(new NicknameStoreTransaction(
return; uuid, new Nickname(displayName, time, serverInfo.getServerUUID()),
} (playerUUID, name) -> name.equals(nicknameCache.getDisplayName(playerUUID))
));
dbSystem.getDatabase().executeTransaction(
new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverInfo.getServerUUID()))
);
} }
} }

View File

@ -167,11 +167,10 @@ public class PlayerOnlineListener implements Listener {
sessionCache.cacheSession(uuid, new Session(uuid, serverUUID, time, world, gm)) sessionCache.cacheSession(uuid, new Session(uuid, serverUUID, time, world, gm))
.ifPresent(previousSession -> database.executeTransaction(new SessionEndTransaction(previousSession))); .ifPresent(previousSession -> database.executeTransaction(new SessionEndTransaction(previousSession)));
if (!displayName.equals(nicknameCache.getDisplayName(uuid))) { database.executeTransaction(new NicknameStoreTransaction(
database.executeTransaction( uuid, new Nickname(displayName, time, serverUUID),
new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverUUID)) (playerUUID, name) -> name.equals(nicknameCache.getDisplayName(playerUUID))
); ));
}
processing.submitNonCritical(processors.info().playerPageUpdateProcessor(uuid)); 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 com.djrapitops.plan.db.access.transactions.Transaction;
import java.util.UUID; import java.util.UUID;
import java.util.function.BiPredicate;
/** /**
* Transaction to store player's nickname information in the database. * 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 UUID playerUUID;
private final Nickname nickname; 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.playerUUID = playerUUID;
this.nickname = nickname; this.nickname = nickname;
this.isNicknameCachedCheck = isNicknameCachedCheck;
}
@Override
protected boolean shouldBeExecuted() {
return !isNicknameCachedCheck.test(playerUUID, nickname.getName());
} }
@Override @Override

View File

@ -68,18 +68,6 @@ public class NicknameCache implements SubSystem {
displayNames.clear(); 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) { public void removeDisplayName(UUID uuid) {
displayNames.remove(uuid); displayNames.remove(uuid);
} }

View File

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

View File

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

View File

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