mirror of
https://github.com/prometheus/prometheus.git
synced 2025-01-11 05:47:27 -08:00
tsdb: coalesce lock/unlock operations for append (#9061)
Fetch the low watermark value under the same lock as we need for the appender, rather than releasing then re-aquiring a lock on the same Mutex. Signed-off-by: Bryan Boreham <bjboreham@gmail.com>
This commit is contained in:
parent
62598878dd
commit
dc8f505595
|
@ -1232,8 +1232,7 @@ func (h *Head) Appender(_ context.Context) storage.Appender {
|
|||
}
|
||||
|
||||
func (h *Head) appender() *headAppender {
|
||||
appendID := h.iso.newAppendID()
|
||||
cleanupAppendIDsBelow := h.iso.lowWatermark()
|
||||
appendID, cleanupAppendIDsBelow := h.iso.newAppendID()
|
||||
|
||||
// Allocate the exemplars buffer only if exemplars are enabled.
|
||||
var exemplarsBuf []exemplarWithSeriesRef
|
||||
|
|
|
@ -86,6 +86,10 @@ func newIsolation() *isolation {
|
|||
func (i *isolation) lowWatermark() uint64 {
|
||||
i.appendMtx.RLock() // Take appendMtx first.
|
||||
defer i.appendMtx.RUnlock()
|
||||
return i.lowWatermarkLocked()
|
||||
}
|
||||
|
||||
func (i *isolation) lowWatermarkLocked() uint64 {
|
||||
i.readMtx.RLock()
|
||||
defer i.readMtx.RUnlock()
|
||||
if i.readsOpen.prev != i.readsOpen {
|
||||
|
@ -122,7 +126,8 @@ func (i *isolation) State() *isolationState {
|
|||
|
||||
// newAppendID increments the transaction counter and returns a new transaction
|
||||
// ID. The first ID returned is 1.
|
||||
func (i *isolation) newAppendID() uint64 {
|
||||
// Also returns the low watermark, to keep lock/unlock operations down
|
||||
func (i *isolation) newAppendID() (uint64, uint64) {
|
||||
i.appendMtx.Lock()
|
||||
defer i.appendMtx.Unlock()
|
||||
|
||||
|
@ -138,7 +143,7 @@ func (i *isolation) newAppendID() uint64 {
|
|||
i.appendsOpenList.prev = app
|
||||
|
||||
i.appendsOpen[app.appendID] = app
|
||||
return app.appendID
|
||||
return app.appendID, i.lowWatermarkLocked()
|
||||
}
|
||||
|
||||
func (i *isolation) lastAppendID() uint64 {
|
||||
|
|
|
@ -35,8 +35,7 @@ func BenchmarkIsolation(b *testing.B) {
|
|||
<-start
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
appendID := iso.newAppendID()
|
||||
_ = iso.lowWatermark()
|
||||
appendID, _ := iso.newAppendID()
|
||||
|
||||
iso.closeAppend(appendID)
|
||||
}
|
||||
|
@ -66,8 +65,7 @@ func BenchmarkIsolationWithState(b *testing.B) {
|
|||
<-start
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
appendID := iso.newAppendID()
|
||||
_ = iso.lowWatermark()
|
||||
appendID, _ := iso.newAppendID()
|
||||
|
||||
iso.closeAppend(appendID)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue