forked from External/grumble
Freeze a full snapshot of the server to disk after 100 log ops. (This removes the current log and opens a new one)
This commit is contained in:
parent
eb4f3319fd
commit
9194e578e3
3 changed files with 23 additions and 1 deletions
|
|
@ -667,6 +667,7 @@ func (server *Server) UpdateFrozenUser(user *User) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
server.Fatal(err)
|
server.Fatal(err)
|
||||||
}
|
}
|
||||||
|
server.numLogOps += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark a user as deleted in the datstore.
|
// Mark a user as deleted in the datstore.
|
||||||
|
|
@ -675,6 +676,7 @@ func (server *Server) DeleteFrozenUser(user *User) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
server.Fatal(err)
|
server.Fatal(err)
|
||||||
}
|
}
|
||||||
|
server.numLogOps += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Given a target channel and a ChannelState protocol message, create a freezer.Channel that
|
// 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 {
|
if err != nil {
|
||||||
server.Fatal(err)
|
server.Fatal(err)
|
||||||
}
|
}
|
||||||
|
server.numLogOps += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write a channel's ACL and Group data to disk. Mumble doesn't support
|
// 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 {
|
if err != nil {
|
||||||
server.Fatal(err)
|
server.Fatal(err)
|
||||||
}
|
}
|
||||||
|
server.numLogOps += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark a channel as deleted in the datastore.
|
// Mark a channel as deleted in the datastore.
|
||||||
|
|
@ -749,6 +753,7 @@ func (server *Server) DeleteFrozenChannel(channel *Channel) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
server.Fatal(err)
|
server.Fatal(err)
|
||||||
}
|
}
|
||||||
|
server.numLogOps += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the server's banlist to the datastore.
|
// Write the server's banlist to the datastore.
|
||||||
|
|
@ -761,6 +766,7 @@ func (server *Server) UpdateFrozenBans(bans []ban.Ban) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
server.Fatal(err)
|
server.Fatal(err)
|
||||||
}
|
}
|
||||||
|
server.numLogOps += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write an updated config value to the datastore.
|
// Write an updated config value to the datastore.
|
||||||
|
|
@ -773,6 +779,7 @@ func (server *Server) UpdateConfig(key, value string) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
server.Fatal(err)
|
server.Fatal(err)
|
||||||
}
|
}
|
||||||
|
server.numLogOps += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete the config value identified by the given key from the datastore.
|
// 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 {
|
if err != nil {
|
||||||
server.Fatal(err)
|
server.Fatal(err)
|
||||||
}
|
}
|
||||||
|
server.numLogOps += 1
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,7 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
log.SetPrefix("[G] ")
|
log.SetPrefix("[G] ")
|
||||||
|
log.SetFlags(log.LstdFlags|log.Lmicroseconds)
|
||||||
log.Printf("Grumble")
|
log.Printf("Grumble")
|
||||||
|
|
||||||
log.Printf("Using blob directory: %s", *blobdir)
|
log.Printf("Using blob directory: %s", *blobdir)
|
||||||
|
|
|
||||||
15
server.go
15
server.go
|
|
@ -36,6 +36,7 @@ import (
|
||||||
const DefaultPort = 64738
|
const DefaultPort = 64738
|
||||||
const UDPPacketSize = 1024
|
const UDPPacketSize = 1024
|
||||||
|
|
||||||
|
const LogOpsBeforeSync = 100
|
||||||
const CeltCompatBitstream = -2147483637
|
const CeltCompatBitstream = -2147483637
|
||||||
const (
|
const (
|
||||||
StateClientConnected = iota
|
StateClientConnected = iota
|
||||||
|
|
@ -96,6 +97,7 @@ type Server struct {
|
||||||
pool *sessionpool.SessionPool
|
pool *sessionpool.SessionPool
|
||||||
|
|
||||||
// Freezer
|
// Freezer
|
||||||
|
numLogOps int
|
||||||
freezelog *freezer.Log
|
freezelog *freezer.Log
|
||||||
|
|
||||||
// ACL cache
|
// 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.Channels[0] = NewChannel(0, "Root")
|
||||||
s.nextChanId = 1
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -388,6 +390,17 @@ func (server *Server) handler() {
|
||||||
case <-regtick:
|
case <-regtick:
|
||||||
server.RegisterPublicServer()
|
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")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue