Merge pull request #1156 from slingamn/lastseen

tweaks to lastSeen persistence
This commit is contained in:
Shivaram Lingamneni 2020-06-29 18:04:55 -07:00 committed by GitHub
commit a7107bfb67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 4 deletions

View File

@ -1245,6 +1245,7 @@ func (am *AccountManager) Unregister(account string, erase bool) error {
joinedChannelsKey := fmt.Sprintf(keyAccountJoinedChannels, casefoldedAccount)
lastSeenKey := fmt.Sprintf(keyAccountLastSeen, casefoldedAccount)
unregisteredKey := fmt.Sprintf(keyAccountUnregistered, casefoldedAccount)
modesKey := fmt.Sprintf(keyAccountModes, casefoldedAccount)
var clients []*Client
@ -1299,6 +1300,7 @@ func (am *AccountManager) Unregister(account string, erase bool) error {
tx.Delete(channelsKey)
tx.Delete(joinedChannelsKey)
tx.Delete(lastSeenKey)
tx.Delete(modesKey)
_, err := tx.Delete(vhostQueueKey)
am.decrementVHostQueueCount(casefoldedAccount, err)

View File

@ -34,7 +34,7 @@ const (
maxDeviceIDsPerClient = 64
// controls how often often we write an autoreplay-missed client's
// deviceid->lastseentime mapping to the database
lastSeenWriteInterval = time.Minute * 10
lastSeenWriteInterval = time.Hour
)
// ResumeDetails is a place to stash data at various stages of
@ -1724,7 +1724,7 @@ func (client *Client) wakeWriter() {
func (client *Client) writeLoop() {
for {
client.performWrite()
client.performWrite(0)
client.writerSemaphore.Release()
client.stateMutex.RLock()
@ -1737,9 +1737,9 @@ func (client *Client) writeLoop() {
}
}
func (client *Client) performWrite() {
func (client *Client) performWrite(additionalDirtyBits uint) {
client.stateMutex.Lock()
dirtyBits := client.dirtyBits
dirtyBits := client.dirtyBits | additionalDirtyBits
client.dirtyBits = 0
account := client.account
client.stateMutex.Unlock()
@ -1775,3 +1775,21 @@ func (client *Client) performWrite() {
client.server.accounts.saveModes(account, uModes)
}
}
// Blocking store; see Channel.Store and Socket.BlockingWrite
func (client *Client) Store(dirtyBits uint) (err error) {
defer func() {
client.stateMutex.Lock()
isDirty := client.dirtyBits != 0
client.stateMutex.Unlock()
if isDirty {
client.wakeWriter()
}
}()
client.writerSemaphore.Acquire()
defer client.writerSemaphore.Release()
client.performWrite(dirtyBits)
return nil
}

View File

@ -106,6 +106,7 @@ func (client *Client) AddSession(session *Session) (success bool, numSessions in
newSessions[len(newSessions)-1] = session
if client.accountSettings.AutoreplayMissed || session.deviceID != "" {
lastSeen = client.lastSeen[session.deviceID]
client.setLastSeen(time.Now().UTC(), session.deviceID)
}
client.sessions = newSessions
if client.autoAway {

View File

@ -116,6 +116,9 @@ func (server *Server) Shutdown() {
//TODO(dan): Make sure we disallow new nicks
for _, client := range server.clients.AllClients() {
client.Notice("Server is shutting down")
if client.AlwaysOn() {
client.Store(IncludeLastSeen)
}
}
if err := server.store.Close(); err != nil {