diff --git a/tsdb/head.go b/tsdb/head.go index 63d8e9ea1..692f7f77a 100644 --- a/tsdb/head.go +++ b/tsdb/head.go @@ -2079,7 +2079,7 @@ func newMemSeries(lset labels.Labels, id chunks.HeadSeriesRef, isolationDisabled nextAt: math.MinInt64, } if !isolationDisabled { - s.txs = newTxRing(4) + s.txs = newTxRing(0) } return s } diff --git a/tsdb/head_read.go b/tsdb/head_read.go index 362764480..29f845c7b 100644 --- a/tsdb/head_read.go +++ b/tsdb/head_read.go @@ -682,7 +682,7 @@ func (s *memSeries) iterator(id chunks.HeadChunkID, c chunkenc.Chunk, isoState * // Removing the extra transactionIDs that are relevant for samples that // come after this chunk, from the total transactionIDs. - appendIDsToConsider := s.txs.txIDCount - (totalSamples - (previousSamples + numSamples)) + appendIDsToConsider := int(s.txs.txIDCount) - (totalSamples - (previousSamples + numSamples)) // Iterate over the appendIDs, find the first one that the isolation state says not // to return. diff --git a/tsdb/head_test.go b/tsdb/head_test.go index e30f16d46..83abeacbe 100644 --- a/tsdb/head_test.go +++ b/tsdb/head_test.go @@ -2552,7 +2552,7 @@ func TestIsolationAppendIDZeroIsNoop(t *testing.T) { ok, _ := s.append(0, 0, 0, cOpts) require.True(t, ok, "Series append failed.") - require.Equal(t, 0, s.txs.txIDCount, "Series should not have an appendID after append with appendID=0.") + require.Equal(t, 0, int(s.txs.txIDCount), "Series should not have an appendID after append with appendID=0.") } func TestHeadSeriesChunkRace(t *testing.T) { diff --git a/tsdb/isolation.go b/tsdb/isolation.go index e436884a8..86330f36e 100644 --- a/tsdb/isolation.go +++ b/tsdb/isolation.go @@ -240,8 +240,8 @@ func (i *isolation) closeAppend(appendID uint64) { // The transactionID ring buffer. type txRing struct { txIDs []uint64 - txIDFirst int // Position of the first id in the ring. - txIDCount int // How many ids in the ring. + txIDFirst uint32 // Position of the first id in the ring. + txIDCount uint32 // How many ids in the ring. } func newTxRing(capacity int) *txRing { @@ -251,21 +251,28 @@ func newTxRing(capacity int) *txRing { } func (txr *txRing) add(appendID uint64) { - if txr.txIDCount == len(txr.txIDs) { + if int(txr.txIDCount) == len(txr.txIDs) { // Ring buffer is full, expand by doubling. - newRing := make([]uint64, txr.txIDCount*2) + newLen := txr.txIDCount * 2 + if newLen == 0 { + newLen = 4 + } + newRing := make([]uint64, newLen) idx := copy(newRing, txr.txIDs[txr.txIDFirst:]) copy(newRing[idx:], txr.txIDs[:txr.txIDFirst]) txr.txIDs = newRing txr.txIDFirst = 0 } - txr.txIDs[(txr.txIDFirst+txr.txIDCount)%len(txr.txIDs)] = appendID + txr.txIDs[int(txr.txIDFirst+txr.txIDCount)%len(txr.txIDs)] = appendID txr.txIDCount++ } func (txr *txRing) cleanupAppendIDsBelow(bound uint64) { - pos := txr.txIDFirst + if len(txr.txIDs) == 0 { + return + } + pos := int(txr.txIDFirst) for txr.txIDCount > 0 { if txr.txIDs[pos] < bound { @@ -281,7 +288,7 @@ func (txr *txRing) cleanupAppendIDsBelow(bound uint64) { } } - txr.txIDFirst %= len(txr.txIDs) + txr.txIDFirst %= uint32(len(txr.txIDs)) } func (txr *txRing) iterator() *txRingIterator { @@ -296,7 +303,7 @@ func (txr *txRing) iterator() *txRingIterator { type txRingIterator struct { ids []uint64 - pos int + pos uint32 } func (it *txRingIterator) At() uint64 { @@ -305,7 +312,7 @@ func (it *txRingIterator) At() uint64 { func (it *txRingIterator) Next() { it.pos++ - if it.pos == len(it.ids) { + if int(it.pos) == len(it.ids) { it.pos = 0 } }