Safer entity tracker - Close GH-7

This commit is contained in:
Sotr
2018-07-13 20:40:24 +08:00
parent b859bf6b4d
commit c926121dd6
2 changed files with 22 additions and 20 deletions

View File

@@ -71,7 +71,7 @@ public class AkarinSlackScheduler extends Thread {
conn.setPendingPing(true); conn.setPendingPing(true);
conn.setLastPing(currentTime); conn.setLastPing(currentTime);
conn.setKeepAliveID(currentTime); conn.setKeepAliveID(currentTime);
Akari.sendPacket(conn, new PacketPlayOutKeepAlive(conn.getKeepAliveID())); Akari.sendPacket(conn, new PacketPlayOutKeepAlive(conn.getKeepAliveID())); // 15s lagg you should stop your server
} }
} }
} }

View File

@@ -6,7 +6,7 @@ import com.google.common.collect.Sets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.Set; import java.util.Set;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantLock;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -23,7 +23,7 @@ public class EntityTracker {
private static final Logger a = LogManager.getLogger(); private static final Logger a = LogManager.getLogger();
private final WorldServer world; private final WorldServer world;
private final Set<EntityTrackerEntry> c = Sets.newConcurrentHashSet(); // Akarin - make concurrent private final Set<EntityTrackerEntry> c = Sets.newConcurrentHashSet(); // Akarin - make concurrent
private final ReentrantReadWriteLock entriesLock = new ReentrantReadWriteLock(); // Akarin - add lock private final ReentrantLock entriesLock = new ReentrantLock(); // Akarin - add lock
public final IntHashMap<EntityTrackerEntry> trackedEntities = new IntHashMap(); public final IntHashMap<EntityTrackerEntry> trackedEntities = new IntHashMap();
private int e; private int e;
@@ -40,8 +40,8 @@ public class EntityTracker {
if (entity instanceof EntityPlayer) { if (entity instanceof EntityPlayer) {
this.addEntity(entity, 512, 2); this.addEntity(entity, 512, 2);
EntityPlayer entityplayer = (EntityPlayer) entity; EntityPlayer entityplayer = (EntityPlayer) entity;
entriesLock.readLock().lock(); // Akarin
Iterator iterator = this.c.iterator(); Iterator iterator = this.c.iterator();
entriesLock.lock(); // Akarin
while (iterator.hasNext()) { while (iterator.hasNext()) {
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
@@ -50,7 +50,7 @@ public class EntityTracker {
entitytrackerentry.updatePlayer(entityplayer); entitytrackerentry.updatePlayer(entityplayer);
} }
} }
entriesLock.readLock().unlock(); // Akarin entriesLock.unlock(); // Akarin
} else if (entity instanceof EntityFishingHook) { } else if (entity instanceof EntityFishingHook) {
this.addEntity(entity, 64, 5, true); this.addEntity(entity, 64, 5, true);
} else if (entity instanceof EntityArrow) { } else if (entity instanceof EntityArrow) {
@@ -127,12 +127,12 @@ public class EntityTracker {
EntityTrackerEntry entitytrackerentry = new EntityTrackerEntry(entity, i, this.e, j, flag); EntityTrackerEntry entitytrackerentry = new EntityTrackerEntry(entity, i, this.e, j, flag);
entriesLock.writeLock().lock(); // Akarin entriesLock.lock(); // Akarin
this.c.add(entitytrackerentry); this.c.add(entitytrackerentry);
entriesLock.writeLock().unlock(); // Akarin
this.trackedEntities.a(entity.getId(), entitytrackerentry); this.trackedEntities.a(entity.getId(), entitytrackerentry);
entitytrackerentry.scanPlayers(this.world.players); entitytrackerentry.scanPlayers(this.world.players);
entriesLock.unlock(); // Akarin
} catch (Throwable throwable) { } catch (Throwable throwable) {
CrashReport crashreport = CrashReport.a(throwable, "Adding entity to track"); CrashReport crashreport = CrashReport.a(throwable, "Adding entity to track");
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity To Track"); CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity To Track");
@@ -169,32 +169,34 @@ public class EntityTracker {
public void untrackEntity(Entity entity) { public void untrackEntity(Entity entity) {
org.spigotmc.AsyncCatcher.catchOp( "entity untrack"); // Spigot org.spigotmc.AsyncCatcher.catchOp( "entity untrack"); // Spigot
entriesLock.writeLock().lock(); // Akarin
if (entity instanceof EntityPlayer) { if (entity instanceof EntityPlayer) {
EntityPlayer entityplayer = (EntityPlayer) entity; EntityPlayer entityplayer = (EntityPlayer) entity;
Iterator iterator = this.c.iterator(); Iterator iterator = this.c.iterator();
entriesLock.lock(); // Akarin
while (iterator.hasNext()) { while (iterator.hasNext()) {
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
entitytrackerentry.a(entityplayer); entitytrackerentry.a(entityplayer);
} }
entriesLock.unlock(); // Akarin
} }
EntityTrackerEntry entitytrackerentry1 = this.trackedEntities.d(entity.getId()); EntityTrackerEntry entitytrackerentry1 = this.trackedEntities.d(entity.getId());
if (entitytrackerentry1 != null) { if (entitytrackerentry1 != null) {
entriesLock.lock(); // Akarin
this.c.remove(entitytrackerentry1); this.c.remove(entitytrackerentry1);
entitytrackerentry1.a(); entitytrackerentry1.a();
entriesLock.unlock(); // Akarin
} }
entriesLock.writeLock().unlock(); // Akarin
} }
public void updatePlayers() { public void updatePlayers() {
ArrayList arraylist = Lists.newArrayList(); ArrayList arraylist = Lists.newArrayList();
entriesLock.readLock().lock(); // Akarin
Iterator iterator = this.c.iterator(); Iterator iterator = this.c.iterator();
world.timings.tracker1.startTiming(); // Spigot world.timings.tracker1.startTiming(); // Spigot
entriesLock.lock(); // Akarin
while (iterator.hasNext()) { while (iterator.hasNext()) {
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
@@ -207,7 +209,6 @@ public class EntityTracker {
} }
} }
} }
entriesLock.readLock().unlock(); // Akarin
world.timings.tracker1.stopTiming(); // Spigot world.timings.tracker1.stopTiming(); // Spigot
world.timings.tracker2.startTiming(); // Spigot world.timings.tracker2.startTiming(); // Spigot
@@ -223,13 +224,14 @@ public class EntityTracker {
} }
} }
} }
entriesLock.unlock(); // Akarin
world.timings.tracker2.stopTiming(); // Spigot world.timings.tracker2.stopTiming(); // Spigot
} }
public void a(EntityPlayer entityplayer) { public void a(EntityPlayer entityplayer) {
entriesLock.readLock().lock(); // Akarin
Iterator iterator = this.c.iterator(); Iterator iterator = this.c.iterator();
entriesLock.lock(); // Akarin
while (iterator.hasNext()) { while (iterator.hasNext()) {
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
@@ -240,7 +242,7 @@ public class EntityTracker {
entitytrackerentry.updatePlayer(entityplayer); entitytrackerentry.updatePlayer(entityplayer);
} }
} }
entriesLock.readLock().unlock(); // Akarin entriesLock.unlock(); // Akarin
} }
public void a(Entity entity, Packet<?> packet) { public void a(Entity entity, Packet<?> packet) {
@@ -262,22 +264,22 @@ public class EntityTracker {
} }
public void untrackPlayer(EntityPlayer entityplayer) { public void untrackPlayer(EntityPlayer entityplayer) {
entriesLock.readLock().lock(); // Akarin
Iterator iterator = this.c.iterator(); Iterator iterator = this.c.iterator();
entriesLock.lock(); // Akarin
while (iterator.hasNext()) { while (iterator.hasNext()) {
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
entitytrackerentry.clear(entityplayer); entitytrackerentry.clear(entityplayer);
} }
entriesLock.readLock().unlock(); // Akarin entriesLock.unlock(); // Akarin
} }
public void a(EntityPlayer entityplayer, Chunk chunk) { public void a(EntityPlayer entityplayer, Chunk chunk) {
ArrayList arraylist = Lists.newArrayList(); ArrayList arraylist = Lists.newArrayList();
ArrayList arraylist1 = Lists.newArrayList(); ArrayList arraylist1 = Lists.newArrayList();
entriesLock.readLock().lock(); // Akarin
Iterator iterator = this.c.iterator(); Iterator iterator = this.c.iterator();
entriesLock.lock(); // Akarin
while (iterator.hasNext()) { while (iterator.hasNext()) {
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
@@ -294,7 +296,7 @@ public class EntityTracker {
} }
} }
} }
entriesLock.readLock().unlock(); // Akarin entriesLock.unlock(); // Akarin
Entity entity1; Entity entity1;
@@ -320,14 +322,14 @@ public class EntityTracker {
public void a(int i) { public void a(int i) {
this.e = (i - 1) * 16; this.e = (i - 1) * 16;
entriesLock.readLock().lock(); // Akarin
Iterator iterator = this.c.iterator(); Iterator iterator = this.c.iterator();
entriesLock.lock(); // Akarin
while (iterator.hasNext()) { while (iterator.hasNext()) {
EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next();
entitytrackerentry.a(this.e); entitytrackerentry.a(this.e);
} }
entriesLock.readLock().unlock(); // Akarin entriesLock.unlock(); // Akarin
} }
} }