diff --git a/freeze.go b/freeze.go index 7f27a08..498ca7a 100644 --- a/freeze.go +++ b/freeze.go @@ -667,6 +667,7 @@ func (server *Server) UpdateFrozenUser(user *User) { if err != nil { server.Fatal(err) } + server.numLogOps += 1 } // Mark a user as deleted in the datstore. @@ -675,6 +676,7 @@ func (server *Server) DeleteFrozenUser(user *User) { if err != nil { server.Fatal(err) } + server.numLogOps += 1 } // Given a target channel and a ChannelState protocol message, create a freezer.Channel that @@ -706,6 +708,7 @@ func (server *Server) UpdateFrozenChannel(channel *Channel, state *mumbleproto.C if err != nil { server.Fatal(err) } + server.numLogOps += 1 } // Write a channel's ACL and Group data to disk. Mumble doesn't support @@ -741,6 +744,7 @@ func (server *Server) UpdateFrozenChannelACLs(channel *Channel) { if err != nil { server.Fatal(err) } + server.numLogOps += 1 } // Mark a channel as deleted in the datastore. @@ -749,6 +753,7 @@ func (server *Server) DeleteFrozenChannel(channel *Channel) { if err != nil { server.Fatal(err) } + server.numLogOps += 1 } // Write the server's banlist to the datastore. @@ -761,6 +766,7 @@ func (server *Server) UpdateFrozenBans(bans []ban.Ban) { if err != nil { server.Fatal(err) } + server.numLogOps += 1 } // Write an updated config value to the datastore. @@ -773,6 +779,7 @@ func (server *Server) UpdateConfig(key, value string) { if err != nil { server.Fatal(err) } + server.numLogOps += 1 } // Delete the config value identified by the given key from the datastore. @@ -784,4 +791,5 @@ func (server *Server) ResetConfig(key string) { if err != nil { server.Fatal(err) } + server.numLogOps += 1 } diff --git a/grumble.go b/grumble.go index fd83952..b629953 100644 --- a/grumble.go +++ b/grumble.go @@ -79,6 +79,7 @@ func main() { } log.SetPrefix("[G] ") + log.SetFlags(log.LstdFlags|log.Lmicroseconds) log.Printf("Grumble") log.Printf("Using blob directory: %s", *blobdir) diff --git a/server.go b/server.go index 11001b2..76acfd7 100644 --- a/server.go +++ b/server.go @@ -36,6 +36,7 @@ import ( const DefaultPort = 64738 const UDPPacketSize = 1024 +const LogOpsBeforeSync = 100 const CeltCompatBitstream = -2147483637 const ( StateClientConnected = iota @@ -96,6 +97,7 @@ type Server struct { pool *sessionpool.SessionPool // Freezer + numLogOps int freezelog *freezer.Log // ACL cache @@ -160,7 +162,7 @@ func NewServer(id int64, addr string, port int) (s *Server, err os.Error) { s.Channels[0] = NewChannel(0, "Root") s.nextChanId = 1 - s.Logger = log.New(os.Stdout, fmt.Sprintf("[%v] ", s.Id), log.Ldate|log.Ltime) + s.Logger = log.New(os.Stdout, fmt.Sprintf("[%v] ", s.Id), log.LstdFlags|log.Lmicroseconds) return } @@ -388,6 +390,17 @@ func (server *Server) handler() { case <-regtick: server.RegisterPublicServer() } + + // Check if its time to sync the server state and re-open the log + if server.numLogOps >= LogOpsBeforeSync { + server.Print("Writing full server snapshot to disk") + err := server.FreezeToFile() + if err != nil { + server.Fatal(err) + } + server.numLogOps = 0 + server.Print("Wrote full server snapshot to disk") + } } }