@ -46,12 +46,12 @@ import (
"github.com/prometheus/prometheus/tsdb/record"
"github.com/prometheus/prometheus/tsdb/tombstones"
"github.com/prometheus/prometheus/tsdb/tsdbutil"
"github.com/prometheus/prometheus/tsdb/wa l"
"github.com/prometheus/prometheus/tsdb/wlog "
)
func newTestHead ( t testing . TB , chunkRange int64 , compressWAL , oooEnabled bool ) ( * Head , * wa l . WA L ) {
func newTestHead ( t testing . TB , chunkRange int64 , compressWAL , oooEnabled bool ) ( * Head , * wlog . WL ) {
dir := t . TempDir ( )
wlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , compressWAL )
wa l , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , compressWAL )
require . NoError ( t , err )
opts := DefaultHeadOptions ( )
@ -63,14 +63,14 @@ func newTestHead(t testing.TB, chunkRange int64, compressWAL, oooEnabled bool) (
opts . OutOfOrderTimeWindow . Store ( 10 * time . Minute . Milliseconds ( ) )
}
h , err := NewHead ( nil , nil , wlog , nil , opts , nil )
h , err := NewHead ( nil , nil , wa l , nil , opts , nil )
require . NoError ( t , err )
require . NoError ( t , h . chunkDiskMapper . IterateAllChunks ( func ( _ chunks . HeadSeriesRef , _ chunks . ChunkDiskMapperRef , _ , _ int64 , _ uint16 , _ chunkenc . Encoding ) error {
return nil
} ) )
return h , wlog
return h , wa l
}
func BenchmarkCreateSeries ( b * testing . B ) {
@ -88,7 +88,7 @@ func BenchmarkCreateSeries(b *testing.B) {
}
}
func populateTestWAL ( t testing . TB , w * wa l . WA L , recs [ ] interface { } ) {
func populateTestWAL ( t testing . TB , w * wlog . WL , recs [ ] interface { } ) {
var enc record . Encoder
for _ , r := range recs {
switch v := r . ( type ) {
@ -105,12 +105,12 @@ func populateTestWAL(t testing.TB, w *wal.WAL, recs []interface{}) {
}
func readTestWAL ( t testing . TB , dir string ) ( recs [ ] interface { } ) {
sr , err := wa l . NewSegmentsReader ( dir )
sr , err := wlog . NewSegmentsReader ( dir )
require . NoError ( t , err )
defer sr . Close ( )
var dec record . Decoder
r := wa l . NewReader ( sr )
r := wlog . NewReader ( sr )
for r . Next ( ) {
rec := r . Record ( )
@ -189,7 +189,7 @@ func BenchmarkLoadWAL(b *testing.B) {
func ( b * testing . B ) {
dir := b . TempDir ( )
w , err := wa l . New ( nil , nil , dir , false )
w , err := wlog . New ( nil , nil , dir , false )
require . NoError ( b , err )
// Write series.
@ -571,7 +571,7 @@ func TestHead_WALMultiRef(t *testing.T) {
require . NotEqual ( t , ref1 , ref2 , "Refs are the same" )
require . NoError ( t , head . Close ( ) )
w , err = wa l . New ( nil , nil , w . Dir ( ) , false )
w , err = wlog . New ( nil , nil , w . Dir ( ) , false )
require . NoError ( t , err )
opts := DefaultHeadOptions ( )
@ -879,7 +879,7 @@ func TestHeadDeleteSimple(t *testing.T) {
require . NoError ( t , app . Commit ( ) )
// Compare the samples for both heads - before and after the reloadBlocks.
reloadedW , err := wa l . New ( nil , nil , w . Dir ( ) , compress ) // Use a new wal to ensure deleted samples are gone even after a reloadBlocks.
reloadedW , err := wlog . New ( nil , nil , w . Dir ( ) , compress ) // Use a new wal to ensure deleted samples are gone even after a reloadBlocks.
require . NoError ( t , err )
opts := DefaultHeadOptions ( )
opts . ChunkRange = 1000
@ -1000,7 +1000,7 @@ func TestDeletedSamplesAndSeriesStillInWALAfterCheckpoint(t *testing.T) {
require . NoError ( t , hb . Close ( ) )
// Confirm there's been a checkpoint.
cdir , _ , err := wa l . LastCheckpoint ( w . Dir ( ) )
cdir , _ , err := wlog . LastCheckpoint ( w . Dir ( ) )
require . NoError ( t , err )
// Read in checkpoint and WAL.
recs := readTestWAL ( t , cdir )
@ -1592,7 +1592,7 @@ func TestWalRepair_DecodingError(t *testing.T) {
// Fill the wal and corrupt it.
{
w , err := wa l . New ( nil , nil , filepath . Join ( dir , "wal" ) , compress )
w , err := wlog . New ( nil , nil , filepath . Join ( dir , "wal" ) , compress )
require . NoError ( t , err )
for i := 1 ; i <= test . totalRecs ; i ++ {
@ -1613,7 +1613,7 @@ func TestWalRepair_DecodingError(t *testing.T) {
initErr := h . Init ( math . MinInt64 )
err = errors . Cause ( initErr ) // So that we can pick up errors even if wrapped.
_ , corrErr := err . ( * wa l . CorruptionErr )
_ , corrErr := err . ( * wlog . CorruptionErr )
require . True ( t , corrErr , "reading the wal didn't return corruption error" )
require . NoError ( t , h . Close ( ) ) // Head will close the wal as well.
}
@ -1630,10 +1630,10 @@ func TestWalRepair_DecodingError(t *testing.T) {
// Read the wal content after the repair.
{
sr , err := wa l . NewSegmentsReader ( filepath . Join ( dir , "wal" ) )
sr , err := wlog . NewSegmentsReader ( filepath . Join ( dir , "wal" ) )
require . NoError ( t , err )
defer sr . Close ( )
r := wa l . NewReader ( sr )
r := wlog . NewReader ( sr )
var actRec int
for r . Next ( ) {
@ -1655,7 +1655,7 @@ func TestHeadReadWriterRepair(t *testing.T) {
walDir := filepath . Join ( dir , "wal" )
// Fill the chunk segments and corrupt it.
{
w , err := wa l . New ( nil , nil , walDir , false )
w , err := wlog . New ( nil , nil , walDir , false )
require . NoError ( t , err )
opts := DefaultHeadOptions ( )
@ -1717,7 +1717,7 @@ func TestHeadReadWriterRepair(t *testing.T) {
}
func TestNewWalSegmentOnTruncate ( t * testing . T ) {
h , wlog := newTestHead ( t , 1000 , false , false )
h , wa l := newTestHead ( t , 1000 , false , false )
defer func ( ) {
require . NoError ( t , h . Close ( ) )
} ( )
@ -1729,19 +1729,19 @@ func TestNewWalSegmentOnTruncate(t *testing.T) {
}
add ( 0 )
_ , last , err := wa l . Segments ( wlog . Dir ( ) )
_ , last , err := wlog . Segments ( wa l . Dir ( ) )
require . NoError ( t , err )
require . Equal ( t , 0 , last )
add ( 1 )
require . NoError ( t , h . Truncate ( 1 ) )
_ , last , err = wa l . Segments ( wlog . Dir ( ) )
_ , last , err = wlog . Segments ( wa l . Dir ( ) )
require . NoError ( t , err )
require . Equal ( t , 1 , last )
add ( 2 )
require . NoError ( t , h . Truncate ( 2 ) )
_ , last , err = wa l . Segments ( wlog . Dir ( ) )
_ , last , err = wlog . Segments ( wa l . Dir ( ) )
require . NoError ( t , err )
require . Equal ( t , 2 , last )
}
@ -1896,12 +1896,12 @@ func TestMemSeriesIsolation(t *testing.T) {
i = addSamples ( hb )
require . NoError ( t , hb . Close ( ) )
wlog , err := wa l . NewSize ( nil , nil , w . Dir ( ) , 32768 , false )
wa l , err := wlog . NewSize ( nil , nil , w . Dir ( ) , 32768 , false )
require . NoError ( t , err )
opts := DefaultHeadOptions ( )
opts . ChunkRange = 1000
opts . ChunkDirRoot = wlog . Dir ( )
hb , err = NewHead ( nil , nil , wlog , nil , opts , nil )
opts . ChunkDirRoot = wa l . Dir ( )
hb , err = NewHead ( nil , nil , wa l , nil , opts , nil )
defer func ( ) { require . NoError ( t , hb . Close ( ) ) } ( )
require . NoError ( t , err )
require . NoError ( t , hb . Init ( 0 ) )
@ -2832,7 +2832,7 @@ func TestChunkSnapshot(t *testing.T) {
}
openHeadAndCheckReplay := func ( ) {
w , err := wa l . NewSize ( nil , nil , head . wal . Dir ( ) , 32768 , false )
w , err := wlog . NewSize ( nil , nil , head . wal . Dir ( ) , 32768 , false )
require . NoError ( t , err )
head , err = NewHead ( nil , nil , w , nil , head . opts , nil )
require . NoError ( t , err )
@ -3041,7 +3041,7 @@ func TestSnapshotError(t *testing.T) {
require . NoError ( t , f . Close ( ) )
// Create new Head which should replay this snapshot.
w , err := wa l . NewSize ( nil , nil , head . wal . Dir ( ) , 32768 , false )
w , err := wlog . NewSize ( nil , nil , head . wal . Dir ( ) , 32768 , false )
require . NoError ( t , err )
// Testing https://github.com/prometheus/prometheus/issues/9437 with the registry.
head , err = NewHead ( prometheus . NewRegistry ( ) , nil , w , nil , head . opts , nil )
@ -3059,7 +3059,7 @@ func TestSnapshotError(t *testing.T) {
// Tests https://github.com/prometheus/prometheus/issues/9725.
func TestChunkSnapshotReplayBug ( t * testing . T ) {
dir := t . TempDir ( )
wlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
wa l , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
require . NoError ( t , err )
// Write few series records and samples such that the series references are not in order in the WAL
@ -3086,10 +3086,10 @@ func TestChunkSnapshotReplayBug(t *testing.T) {
rec := enc . Series ( [ ] record . RefSeries { seriesRec } , buf )
buf = rec [ : 0 ]
require . NoError ( t , wlog . Log ( rec ) )
require . NoError ( t , wa l . Log ( rec ) )
rec = enc . Samples ( [ ] record . RefSample { samplesRec } , buf )
buf = rec [ : 0 ]
require . NoError ( t , wlog . Log ( rec ) )
require . NoError ( t , wa l . Log ( rec ) )
}
// Write a corrupt snapshot to fail the replay on startup.
@ -3103,7 +3103,7 @@ func TestChunkSnapshotReplayBug(t *testing.T) {
opts := DefaultHeadOptions ( )
opts . ChunkDirRoot = dir
opts . EnableMemorySnapshotOnShutdown = true
head , err := NewHead ( nil , nil , wlog , nil , opts , nil )
head , err := NewHead ( nil , nil , wa l , nil , opts , nil )
require . NoError ( t , err )
require . NoError ( t , head . Init ( math . MinInt64 ) )
defer func ( ) {
@ -3126,7 +3126,7 @@ func TestChunkSnapshotReplayBug(t *testing.T) {
func TestChunkSnapshotTakenAfterIncompleteSnapshot ( t * testing . T ) {
dir := t . TempDir ( )
wlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
wlTemp , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
require . NoError ( t , err )
// Write a snapshot with .tmp suffix. This used to fail taking any further snapshots or replay of snapshots.
@ -3137,7 +3137,7 @@ func TestChunkSnapshotTakenAfterIncompleteSnapshot(t *testing.T) {
opts := DefaultHeadOptions ( )
opts . ChunkDirRoot = dir
opts . EnableMemorySnapshotOnShutdown = true
head , err := NewHead ( nil , nil , wlog , nil , opts , nil )
head , err := NewHead ( nil , nil , wlTemp , nil , opts , nil )
require . NoError ( t , err )
require . NoError ( t , head . Init ( math . MinInt64 ) )
@ -3164,9 +3164,9 @@ func TestChunkSnapshotTakenAfterIncompleteSnapshot(t *testing.T) {
// TODO(codesome): Needs test for ooo WAL repair.
func TestOOOWalReplay ( t * testing . T ) {
dir := t . TempDir ( )
wlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
wa l , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
require . NoError ( t , err )
oooWlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , wa l . WblDirName ) , 32768 , true )
oooWlog , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , wlog . WblDirName ) , 32768 , true )
require . NoError ( t , err )
opts := DefaultHeadOptions ( )
@ -3174,7 +3174,7 @@ func TestOOOWalReplay(t *testing.T) {
opts . ChunkDirRoot = dir
opts . OutOfOrderTimeWindow . Store ( 30 * time . Minute . Milliseconds ( ) )
h , err := NewHead ( nil , nil , wlog , oooWlog , opts , nil )
h , err := NewHead ( nil , nil , wa l , oooWlog , opts , nil )
require . NoError ( t , err )
require . NoError ( t , h . Init ( 0 ) )
@ -3211,11 +3211,11 @@ func TestOOOWalReplay(t *testing.T) {
// Restart head.
require . NoError ( t , h . Close ( ) )
wlog , err = wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
wa l , err = wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
require . NoError ( t , err )
oooWlog , err = wa l . NewSize ( nil , nil , filepath . Join ( dir , wa l . WblDirName ) , 32768 , true )
oooWlog , err = wlog . NewSize ( nil , nil , filepath . Join ( dir , wlog . WblDirName ) , 32768 , true )
require . NoError ( t , err )
h , err = NewHead ( nil , nil , wlog , oooWlog , opts , nil )
h , err = NewHead ( nil , nil , wa l , oooWlog , opts , nil )
require . NoError ( t , err )
require . NoError ( t , h . Init ( 0 ) ) // Replay happens here.
@ -3248,9 +3248,9 @@ func TestOOOWalReplay(t *testing.T) {
// TestOOOMmapReplay checks the replay at a low level.
func TestOOOMmapReplay ( t * testing . T ) {
dir := t . TempDir ( )
wlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
wa l , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
require . NoError ( t , err )
oooWlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , wa l . WblDirName ) , 32768 , true )
oooWlog , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , wlog . WblDirName ) , 32768 , true )
require . NoError ( t , err )
opts := DefaultHeadOptions ( )
@ -3259,7 +3259,7 @@ func TestOOOMmapReplay(t *testing.T) {
opts . OutOfOrderCapMax . Store ( 30 )
opts . OutOfOrderTimeWindow . Store ( 1000 * time . Minute . Milliseconds ( ) )
h , err := NewHead ( nil , nil , wlog , oooWlog , opts , nil )
h , err := NewHead ( nil , nil , wa l , oooWlog , opts , nil )
require . NoError ( t , err )
require . NoError ( t , h . Init ( 0 ) )
@ -3299,11 +3299,11 @@ func TestOOOMmapReplay(t *testing.T) {
// Restart head.
require . NoError ( t , h . Close ( ) )
wlog , err = wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
wa l , err = wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
require . NoError ( t , err )
oooWlog , err = wa l . NewSize ( nil , nil , filepath . Join ( dir , wa l . WblDirName ) , 32768 , true )
oooWlog , err = wlog . NewSize ( nil , nil , filepath . Join ( dir , wlog . WblDirName ) , 32768 , true )
require . NoError ( t , err )
h , err = NewHead ( nil , nil , wlog , oooWlog , opts , nil )
h , err = NewHead ( nil , nil , wa l , oooWlog , opts , nil )
require . NoError ( t , err )
require . NoError ( t , h . Init ( 0 ) ) // Replay happens here.
@ -3373,9 +3373,9 @@ func TestHeadInit_DiscardChunksWithUnsupportedEncoding(t *testing.T) {
require . NoError ( t , h . Close ( ) )
wlog , err := wa l . NewSize ( nil , nil , filepath . Join ( h . opts . ChunkDirRoot , "wal" ) , 32768 , false )
wa l , err := wlog . NewSize ( nil , nil , filepath . Join ( h . opts . ChunkDirRoot , "wal" ) , 32768 , false )
require . NoError ( t , err )
h , err = NewHead ( nil , nil , wlog , nil , h . opts , nil )
h , err = NewHead ( nil , nil , wa l , nil , h . opts , nil )
require . NoError ( t , err )
require . NoError ( t , h . Init ( 0 ) )
@ -3408,7 +3408,7 @@ func (c *unsupportedChunk) Encoding() chunkenc.Encoding {
// Tests https://github.com/prometheus/prometheus/issues/10277.
func TestMmapPanicAfterMmapReplayCorruption ( t * testing . T ) {
dir := t . TempDir ( )
wlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , false )
wa l , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , false )
require . NoError ( t , err )
opts := DefaultHeadOptions ( )
@ -3417,7 +3417,7 @@ func TestMmapPanicAfterMmapReplayCorruption(t *testing.T) {
opts . EnableExemplarStorage = true
opts . MaxExemplars . Store ( config . DefaultExemplarsConfig . MaxExemplars )
h , err := NewHead ( nil , nil , wlog , nil , opts , nil )
h , err := NewHead ( nil , nil , wa l , nil , opts , nil )
require . NoError ( t , err )
require . NoError ( t , h . Init ( 0 ) )
@ -3441,7 +3441,7 @@ func TestMmapPanicAfterMmapReplayCorruption(t *testing.T) {
addChunks ( )
require . NoError ( t , h . Close ( ) )
wlog , err = wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , false )
wa l , err = wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , false )
require . NoError ( t , err )
mmapFilePath := filepath . Join ( dir , "chunks_head" , "000001" )
@ -3451,7 +3451,7 @@ func TestMmapPanicAfterMmapReplayCorruption(t *testing.T) {
require . NoError ( t , err )
require . NoError ( t , f . Close ( ) )
h , err = NewHead ( nil , nil , wlog , nil , opts , nil )
h , err = NewHead ( nil , nil , wa l , nil , opts , nil )
require . NoError ( t , err )
require . NoError ( t , h . Init ( 0 ) )
@ -3467,7 +3467,7 @@ func TestReplayAfterMmapReplayError(t *testing.T) {
var err error
openHead := func ( ) {
wlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , false )
wa l , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , false )
require . NoError ( t , err )
opts := DefaultHeadOptions ( )
@ -3476,7 +3476,7 @@ func TestReplayAfterMmapReplayError(t *testing.T) {
opts . EnableMemorySnapshotOnShutdown = true
opts . MaxExemplars . Store ( config . DefaultExemplarsConfig . MaxExemplars )
h , err = NewHead ( nil , nil , wlog , nil , opts , nil )
h , err = NewHead ( nil , nil , wa l , nil , opts , nil )
require . NoError ( t , err )
require . NoError ( t , h . Init ( 0 ) )
}
@ -3541,9 +3541,9 @@ func TestReplayAfterMmapReplayError(t *testing.T) {
func TestOOOAppendWithNoSeries ( t * testing . T ) {
dir := t . TempDir ( )
wlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
wa l , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
require . NoError ( t , err )
oooWlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , wa l . WblDirName ) , 32768 , true )
oooWlog , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , wlog . WblDirName ) , 32768 , true )
require . NoError ( t , err )
opts := DefaultHeadOptions ( )
@ -3551,7 +3551,7 @@ func TestOOOAppendWithNoSeries(t *testing.T) {
opts . OutOfOrderCapMax . Store ( 30 )
opts . OutOfOrderTimeWindow . Store ( 120 * time . Minute . Milliseconds ( ) )
h , err := NewHead ( nil , nil , wlog , oooWlog , opts , nil )
h , err := NewHead ( nil , nil , wa l , oooWlog , opts , nil )
require . NoError ( t , err )
t . Cleanup ( func ( ) {
require . NoError ( t , h . Close ( ) )
@ -3622,16 +3622,16 @@ func TestOOOAppendWithNoSeries(t *testing.T) {
func TestHeadMinOOOTimeUpdate ( t * testing . T ) {
dir := t . TempDir ( )
wlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
wa l , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , "wal" ) , 32768 , true )
require . NoError ( t , err )
oooWlog , err := wa l . NewSize ( nil , nil , filepath . Join ( dir , wa l . WblDirName ) , 32768 , true )
oooWlog , err := wlog . NewSize ( nil , nil , filepath . Join ( dir , wlog . WblDirName ) , 32768 , true )
require . NoError ( t , err )
opts := DefaultHeadOptions ( )
opts . ChunkDirRoot = dir
opts . OutOfOrderTimeWindow . Store ( 10 * time . Minute . Milliseconds ( ) )
h , err := NewHead ( nil , nil , wlog , oooWlog , opts , nil )
h , err := NewHead ( nil , nil , wa l , oooWlog , opts , nil )
require . NoError ( t , err )
t . Cleanup ( func ( ) {
require . NoError ( t , h . Close ( ) )