Author: bdonlan
Date: 2005-05-26 20:29:56 -0400 (Thu, 26 May 2005)
New Revision: 736
Modified:
trunk/clients/Javer2/server.conf
trunk/clients/Javer2/src/org/haverdev/haver/server/FileUserStore.java
trunk/clients/Javer2/src/org/haverdev/haver/server/PersistantLobby.java
Log:
* FileUserStore uses atomic renames
* Disable persistantlobby in the default config; it's rather broken as-is.
Modified: trunk/clients/Javer2/server.conf
===================================================================
--- trunk/clients/Javer2/server.conf 2005-05-27 00:03:06 UTC (rev 735)
+++ trunk/clients/Javer2/server.conf 2005-05-27 00:29:56 UTC (rev 736)
@@ -23,11 +23,12 @@
org.haverdev.haver.server.FileUserStore.path=store
# The lobby implementation.
-# haver.Lobby=org.haverdev.haver.server.DefaultLobby
-haver.Lobby=org.haverdev.haver.server.PersistantLobby
-org.haverdev.haver.server.PersistantLobby.storePath=serverdata.xml.gz
-org.haverdev.haver.server.PersistantLobby.commitInterval=120
+haver.Lobby=org.haverdev.haver.server.DefaultLobby
+#haver.Lobby=org.haverdev.haver.server.PersistantLobby
+#org.haverdev.haver.server.PersistantLobby.storePath=serverdata.xml.gz
+#org.haverdev.haver.server.PersistantLobby.commitInterval=120
+
# State configurations. You can list more than one command handler here and
# they will be tried in listed order
haver.state.init=init
Modified: trunk/clients/Javer2/src/org/haverdev/haver/server/FileUserStore.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/FileUserStore.java
2005-05-27 00:03:06 UTC (rev 735)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/FileUserStore.java
2005-05-27 00:29:56 UTC (rev 736)
@@ -32,20 +32,20 @@
}
public synchronized UserEntity getUser(String name) {
- SoftReference ref = (SoftReference) cache.get(name);
+ SoftReference ref = (SoftReference) cache.get(name.toLowerCase());
UserEntity user = null;
if (ref != null)
user = (UserEntity)ref.get();
if (user == null) {
try {
- user = loadUser(name);
+ user = loadUser(name.toLowerCase());
}
catch (FileNotFoundException e) {}
catch (Throwable t) {
log.error("While loading user " + name, t);
}
- cache.put(name, new SoftReference(user));
+ cache.put(name.toLowerCase(), new SoftReference(user));
}
if (user == null)
@@ -65,29 +65,33 @@
synchronized void commitUser(UserEntity who) throws IOException {
if (busy) return;
+ String name = who.getName().toLowerCase();
+
if (!who.isPersistant()) {
if (cache.containsKey(who.getName())) {
- new File(path + who.getName()).delete();
- cache.remove(who.getName());
+ new File(path + name).delete();
+ cache.remove(name);
return;
}
}
- if (!cache.containsKey(who.getName()))
- cache.put(who.getName(), new SoftReference(who));
-
- XMLEncoder e = new XMLEncoder
- (new BufferedOutputStream
- (new FileOutputStream
- (path + who.getName()
- )));
+ if (!cache.containsKey(name))
+ cache.put(name, new SoftReference(who));
try {
busy = true;
+ try { new File(path + "_" + name).delete(); } catch (Throwable t)
{}
+ XMLEncoder e = new XMLEncoder
+ (new BufferedOutputStream
+ (new FileOutputStream
+ (path + "_" + name
+ )));
e.writeObject(who);
+ e.close();
+ new File(path + "_" + name).renameTo(new File(path + name));
} finally {
+ try { new File(path + "_" + name).delete(); } catch (Throwable t)
{}
busy = false;
}
- e.close();
}
synchronized UserEntity loadUser(String who) throws IOException {
@@ -103,6 +107,8 @@
} finally {
busy = false;
}
+ if (!u.getName().toLowerCase().equals(who))
+ throw new IllegalStateException("name mismatch in stored data for
" + who + " vs " + u.getName());
return u;
}
Modified:
trunk/clients/Javer2/src/org/haverdev/haver/server/PersistantLobby.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/PersistantLobby.java
2005-05-27 00:03:06 UTC (rev 735)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/PersistantLobby.java
2005-05-27 00:29:56 UTC (rev 736)
@@ -12,6 +12,8 @@
import org.apache.log4j.*;
+// XXX: this is something of a hack. Don't use it for now.
+
/**
*
* @author bdonlan
@@ -87,7 +89,7 @@
logger.debug("Committing...");
Entity[] everything = getContents();
for (int i = 0; i < everything.length; i++)
- if (everything[i].isPersistant())
+ if (everything[i].isPersistant() &&
!everything[i].getNamespace().equals("user"))
e.writeObject(everything[i]);
e.close();
}