Prevent reading and writing the usermap at the same time.

This commit is contained in:
KHobbits 2014-05-17 01:50:41 +01:00
parent ed9e4ecd28
commit 8e7abe325e
2 changed files with 46 additions and 32 deletions

View file

@ -45,45 +45,56 @@ public class UUIDMap
userList.createNewFile();
}
final BufferedReader reader = new BufferedReader(new FileReader(userList));
try
synchronized (pendingDiskWrites)
{
while (true)
if (ess.getSettings().isDebug())
{
final String line = reader.readLine();
if (line == null)
ess.getLogger().log(Level.INFO, "Reading usermap from disk");
}
names.clear();
history.clear();
final BufferedReader reader = new BufferedReader(new FileReader(userList));
try
{
while (true)
{
break;
}
else
{
final String[] values = splitPattern.split(line);
if (values.length == 2)
final String line = reader.readLine();
if (line == null)
{
final String name = values[0];
final UUID uuid = UUID.fromString(values[1]);
names.put(name, uuid);
if (!history.containsKey(uuid))
break;
}
else
{
final String[] values = splitPattern.split(line);
if (values.length == 2)
{
final ArrayList<String> list = new ArrayList<String>();
list.add(name);
history.put(uuid, list);
}
else
{
final ArrayList<String> list = history.get(uuid);
if (!list.contains(name))
final String name = values[0];
final UUID uuid = UUID.fromString(values[1]);
names.put(name, uuid);
if (!history.containsKey(uuid))
{
final ArrayList<String> list = new ArrayList<String>();
list.add(name);
history.put(uuid, list);
}
else
{
final ArrayList<String> list = history.get(uuid);
if (!list.contains(name))
{
list.add(name);
}
}
}
}
}
}
}
finally
{
reader.close();
finally
{
reader.close();
}
}
}
catch (IOException ex)
@ -99,6 +110,10 @@ public class UUIDMap
public void forceWriteUUIDMap()
{
if (ess.getSettings().isDebug())
{
ess.getLogger().log(Level.INFO, "Forcing usermap write to disk");
}
try
{
Future<?> future = _writeUUIDMap();;
@ -119,7 +134,7 @@ public class UUIDMap
public Future<?> _writeUUIDMap()
{
final ConcurrentSkipListMap<String, UUID> names = ess.getUserMap().getNames().clone();
final ConcurrentSkipListMap<String, UUID> names = ess.getUserMap().getNames();
if (names.size() < 1)
{
return null;

View file

@ -51,7 +51,6 @@ public class UserMap extends CacheLoader<UUID, User> implements IConf
return;
}
keys.clear();
names.clear();
users.invalidateAll();
for (String string : userdir.list())
{
@ -200,7 +199,7 @@ public class UserMap extends CacheLoader<UUID, User> implements IConf
public Set<UUID> getAllUniqueUsers()
{
return Collections.unmodifiableSet(keys);
return Collections.unmodifiableSet(keys.clone());
}
public int getUniqueUsers()
@ -208,12 +207,12 @@ public class UserMap extends CacheLoader<UUID, User> implements IConf
return keys.size();
}
public ConcurrentSkipListMap<String, UUID> getNames()
protected ConcurrentSkipListMap<String, UUID> getNames()
{
return names;
}
public ConcurrentSkipListMap<UUID, ArrayList<String>> getHistory()
protected ConcurrentSkipListMap<UUID, ArrayList<String>> getHistory()
{
return history;
}