mirror of
https://github.com/mumble-voip/grumble.git
synced 2025-12-20 06:10:00 -08:00
Use a transaction for UserList updates. Support delta-updates for UserState changes.
This commit is contained in:
parent
c87329a344
commit
48efaf6645
2 changed files with 66 additions and 29 deletions
26
freeze.go
26
freeze.go
|
|
@ -15,6 +15,7 @@ import (
|
|||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Freeze a server to disk, and re-open the log, if needed.
|
||||
|
|
@ -658,15 +659,38 @@ func NewServerFromFrozen(name string) (s *Server, err os.Error) {
|
|||
}
|
||||
|
||||
// Update the datastore with the user's current state.
|
||||
func (server *Server) UpdateFrozenUser(user *User) {
|
||||
func (server *Server) UpdateFrozenUser(user *User, state *mumbleproto.UserState) {
|
||||
// Full sync If there's no userstate messgae provided, or if there is one, and
|
||||
// it includes a registration operation.
|
||||
nanos := time.Nanoseconds()
|
||||
if state == nil || state.UserId != nil {
|
||||
fu, err := user.Freeze()
|
||||
if err != nil {
|
||||
server.Fatal(err)
|
||||
}
|
||||
fu.LastActive = proto.Uint64(uint64(nanos))
|
||||
err = server.freezelog.Put(fu)
|
||||
if err != nil {
|
||||
server.Fatal(err)
|
||||
}
|
||||
} else {
|
||||
fu := &freezer.User{}
|
||||
fu.Id = proto.Uint32(user.Id)
|
||||
if state.ChannelId != nil {
|
||||
fu.LastChannelId = state.ChannelId
|
||||
}
|
||||
if state.TextureHash != nil {
|
||||
fu.TextureBlob = proto.String(user.TextureBlob)
|
||||
}
|
||||
if state.CommentHash != nil {
|
||||
fu.CommentBlob = proto.String(user.CommentBlob)
|
||||
}
|
||||
fu.LastActive = proto.Uint64(uint64(nanos))
|
||||
err := server.freezelog.Put(fu)
|
||||
if err != nil {
|
||||
server.Fatal(err)
|
||||
}
|
||||
}
|
||||
server.numLogOps += 1
|
||||
}
|
||||
|
||||
|
|
|
|||
31
message.go
31
message.go
|
|
@ -7,12 +7,13 @@ package main
|
|||
import (
|
||||
"crypto/aes"
|
||||
"crypto/tls"
|
||||
"mumbleproto"
|
||||
"goprotobuf.googlecode.com/hg/proto"
|
||||
"net"
|
||||
"fmt"
|
||||
"goprotobuf.googlecode.com/hg/proto"
|
||||
"grumble/ban"
|
||||
"grumble/blobstore"
|
||||
"grumble/freezer"
|
||||
"mumbleproto"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
||||
|
|
@ -916,7 +917,7 @@ func (server *Server) handleUserStateMessage(client *Client, msg *Message) {
|
|||
}
|
||||
|
||||
if target.IsRegistered() {
|
||||
server.UpdateFrozenUser(target.user)
|
||||
server.UpdateFrozenUser(target.user, userstate)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1543,6 +1544,8 @@ func (server *Server) handleUserList(client *Client, msg *Message) {
|
|||
}
|
||||
// Rename, registration removal
|
||||
} else {
|
||||
if len(userlist.Users) > 0 {
|
||||
tx := server.freezelog.BeginTx()
|
||||
for _, listUser := range userlist.Users {
|
||||
uid := *listUser.UserId
|
||||
if uid == 0 {
|
||||
|
|
@ -1550,18 +1553,28 @@ func (server *Server) handleUserList(client *Client, msg *Message) {
|
|||
}
|
||||
user, ok := server.Users[uid]
|
||||
if ok {
|
||||
// De-register a user
|
||||
if listUser.Name == nil {
|
||||
// De-register
|
||||
server.RemoveRegistration(uid)
|
||||
server.DeleteFrozenUser(user)
|
||||
|
||||
// Rename user
|
||||
err := tx.Put(&freezer.UserRemove{Id: listUser.UserId})
|
||||
if err != nil {
|
||||
server.Fatal(err)
|
||||
}
|
||||
} else {
|
||||
// Rename user
|
||||
// todo(mkrautz): Validate name.
|
||||
user.Name = *listUser.Name
|
||||
server.UpdateFrozenUser(user)
|
||||
err := tx.Put(&freezer.User{Id: listUser.UserId, Name: listUser.Name})
|
||||
if err != nil {
|
||||
server.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
err := tx.Commit()
|
||||
if err != nil {
|
||||
server.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue