mirror of
https://github.com/gogrlx/nats-server.git
synced 2026-04-16 19:14:41 -07:00
Improve last msg lookup (KV Get) when subject is a literal subject.
Signed-off-by: Derek Collison <derek@nats.io>
This commit is contained in:
@@ -4665,7 +4665,16 @@ func (fs *fileStore) loadLast(subj string, sm *StoreMsg) (lsm *StoreMsg, err err
|
||||
mb.mu.Unlock()
|
||||
return nil, err
|
||||
}
|
||||
_, _, l := mb.filteredPendingLocked(subj, wc, mb.first.seq)
|
||||
var l uint64
|
||||
// Optimize if subject is not a wildcard.
|
||||
if !wc {
|
||||
if ss := mb.fss[subj]; ss != nil {
|
||||
l = ss.Last
|
||||
}
|
||||
}
|
||||
if l == 0 {
|
||||
_, _, l = mb.filteredPendingLocked(subj, wc, mb.first.seq)
|
||||
}
|
||||
if l > 0 {
|
||||
if mb.cacheNotLoaded() {
|
||||
if err := mb.loadMsgsWithLock(); err != nil {
|
||||
|
||||
@@ -864,6 +864,10 @@ func (ms *memStore) LoadLastMsg(subject string, smp *StoreMsg) (*StoreMsg, error
|
||||
|
||||
if subject == _EMPTY_ || subject == fwcs {
|
||||
sm, ok = ms.msgs[ms.state.LastSeq]
|
||||
} else if subjectIsLiteral(subject) {
|
||||
if ss := ms.fss[subject]; ss != nil && ss.Msgs > 0 {
|
||||
sm, ok = ms.msgs[ss.Last]
|
||||
}
|
||||
} else if ss := ms.filteredStateLocked(1, subject, true); ss.Msgs > 0 {
|
||||
sm, ok = ms.msgs[ss.Last]
|
||||
}
|
||||
@@ -895,8 +899,8 @@ func (ms *memStore) LoadNextMsg(filter string, wc bool, start uint64, smp *Store
|
||||
|
||||
isAll := filter == _EMPTY_ || filter == fwcs
|
||||
|
||||
// Skip scan of mb.fss is number of messages in the block are less than
|
||||
// 1/2 the number of subjects in mb.fss. Or we have a wc and lots of fss entries.
|
||||
// Skip scan of ms.fss is number of messages in the block are less than
|
||||
// 1/2 the number of subjects in ms.fss. Or we have a wc and lots of fss entries.
|
||||
const linearScanMaxFSS = 256
|
||||
doLinearScan := isAll || 2*int(ms.state.LastSeq-start) < len(ms.fss) || (wc && len(ms.fss) > linearScanMaxFSS)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user