Changeset 485 in code


Ignore:
Timestamp:
Mar 29, 2021, 3:49:50 PM (4 years ago)
Author:
contact
Message:

Introduce deliveredStore

This hides the double-map complexity behind a dedicated type.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r484 r485  
    362362        }
    363363
    364         delivered := network.delivered.Value(entity)
    365         if delivered == nil {
    366                 return
    367         }
    368 
    369         delivered[dc.clientName] = id
     364        network.delivered.StoreID(entity, dc.clientName, id)
    370365}
    371366
     
    998993                })
    999994                if firstClient {
    1000                         dc.sendNetworkBacklog(net)
     995                        net.delivered.ForEachTarget(func(target string) {
     996                                dc.sendTargetBacklog(net, target)
     997                        })
    1001998                }
    1002999
    10031000                // Fast-forward history to last message
    1004                 for targetCM, entry := range net.delivered.innerMap {
    1005                         delivered := entry.value.(deliveredClientMap)
    1006                         ch := net.channels.Value(targetCM)
     1001                net.delivered.ForEachTarget(func(target string) {
     1002                        ch := net.channels.Value(target)
    10071003                        if ch != nil && ch.Detached {
    1008                                 continue
    1009                         }
    1010 
     1004                                return
     1005                        }
     1006
     1007                        targetCM := net.casemap(target)
    10111008                        lastID, err := dc.user.msgStore.LastMsgID(net, targetCM, time.Now())
    10121009                        if err != nil {
    10131010                                dc.logger.Printf("failed to get last message ID: %v", err)
    1014                                 continue
    1015                         }
    1016                         delivered[dc.clientName] = lastID
    1017                 }
     1011                                return
     1012                        }
     1013
     1014                        net.delivered.StoreID(target, dc.clientName, lastID)
     1015                })
    10181016        })
    10191017
     
    10351033}
    10361034
    1037 func (dc *downstreamConn) sendNetworkBacklog(net *network) {
    1038         for _, entry := range net.delivered.innerMap {
    1039                 target := entry.originalKey
    1040                 dc.sendTargetBacklog(net, target)
    1041         }
    1042 }
    1043 
    10441035func (dc *downstreamConn) sendTargetBacklog(net *network, target string) {
    10451036        if dc.caps["draft/chathistory"] || dc.user.msgStore == nil {
     
    10491040                return
    10501041        }
    1051         delivered := net.delivered.Value(target)
    1052         if delivered == nil {
    1053                 return
    1054         }
    1055         lastDelivered, ok := delivered[dc.clientName]
    1056         if !ok {
     1042
     1043        lastDelivered := net.delivered.LoadID(target, dc.clientName)
     1044        if lastDelivered == "" {
    10571045                return
    10581046        }
  • trunk/upstream.go

    r483 r485  
    17411741        }
    17421742
    1743         delivered := uc.network.delivered.Value(entity)
    17441743        entityCM := uc.network.casemap(entity)
    1745         if delivered == nil {
     1744
     1745        if !uc.network.delivered.HasTarget(entity) {
    17461746                // This is the first message we receive from this target. Save the last
    17471747                // message ID in delivery receipts, so that we can send the new message
     
    17531753                }
    17541754
    1755                 delivered = make(deliveredClientMap)
    1756                 uc.network.delivered.SetValue(entity, delivered)
    1757 
    17581755                for clientName, _ := range uc.user.clients {
    1759                         delivered[clientName] = lastID
     1756                        uc.network.delivered.StoreID(entity, clientName, lastID)
    17601757                }
    17611758        }
  • trunk/user.go

    r483 r485  
    5858type deliveredClientMap map[string]string // client name -> msg ID
    5959
     60type deliveredStore struct {
     61        m deliveredCasemapMap
     62}
     63
     64func newDeliveredStore() deliveredStore {
     65        return deliveredStore{deliveredCasemapMap{newCasemapMap(0)}}
     66}
     67
     68func (ds deliveredStore) HasTarget(target string) bool {
     69        return ds.m.Value(target) != nil
     70}
     71
     72func (ds deliveredStore) LoadID(target, clientName string) string {
     73        clients := ds.m.Value(target)
     74        if clients == nil {
     75                return ""
     76        }
     77        return clients[clientName]
     78}
     79
     80func (ds deliveredStore) StoreID(target, clientName, msgID string) {
     81        clients := ds.m.Value(target)
     82        if clients == nil {
     83                clients = make(deliveredClientMap)
     84                ds.m.SetValue(target, clients)
     85        }
     86        clients[clientName] = msgID
     87}
     88
     89func (ds deliveredStore) ForEachTarget(f func(target string)) {
     90        for _, entry := range ds.m.innerMap {
     91                f(entry.originalKey)
     92        }
     93}
     94
    6095type network struct {
    6196        Network
     
    65100        conn      *upstreamConn
    66101        channels  channelCasemapMap
    67         delivered deliveredCasemapMap
     102        delivered deliveredStore
    68103        lastError error
    69104        casemap   casemapping
     
    82117                stopped:   make(chan struct{}),
    83118                channels:  m,
    84                 delivered: deliveredCasemapMap{newCasemapMap(0)},
     119                delivered: newDeliveredStore(),
    85120                casemap:   casemapRFC1459,
    86121        }
     
    254289        net.casemap = newCasemap
    255290        net.channels.SetCasemapping(newCasemap)
    256         net.delivered.SetCasemapping(newCasemap)
     291        net.delivered.m.SetCasemapping(newCasemap)
    257292        if net.conn != nil {
    258293                net.conn.channels.SetCasemapping(newCasemap)
Note: See TracChangeset for help on using the changeset viewer.