diff --git a/pkg/storage/stores/shipper/indexshipper/tsdb/identifier.go b/pkg/storage/stores/shipper/indexshipper/tsdb/identifier.go index 2b87fb7ffb8c..149d41bfa944 100644 --- a/pkg/storage/stores/shipper/indexshipper/tsdb/identifier.go +++ b/pkg/storage/stores/shipper/indexshipper/tsdb/identifier.go @@ -64,9 +64,14 @@ func (p prefixedIdentifier) Name() string { // Identifier has all the information needed to resolve a TSDB index // Notably this abstracts away OS path separators, etc. type SingleTenantTSDBIdentifier struct { - TS time.Time - From, Through model.Time - Checksum uint32 + // exportTSInSecs tells whether creation timestamp should be exported in unix seconds instead of nanoseconds. + // timestamp in filename could be a unix second or a unix nanosecond so + // helps us to be able to reproduce filename back from parsed identifier. + // Should be true ideally for older files with creation timestamp in seconds. + exportTSInSecs bool + TS time.Time + From, Through model.Time + Checksum uint32 } // implement Hash @@ -77,9 +82,15 @@ func (i SingleTenantTSDBIdentifier) Hash(h hash.Hash32) (err error) { // str builds filename with format + `-` + `compactor` + `-` + + `-` + `-` + func (i SingleTenantTSDBIdentifier) str() string { + ts := int64(0) + if i.exportTSInSecs { + ts = i.TS.Unix() + } else { + ts = i.TS.UnixNano() + } return fmt.Sprintf( "%d-%s-%d-%d-%x.tsdb", - i.TS.UnixNano(), + ts, compactedFileUploader, i.From, i.Through, @@ -140,10 +151,11 @@ func ParseSingleTenantTSDBPath(p string) (id SingleTenantTSDBIdentifier, ok bool parsedTS = time.Unix(0, ts) } return SingleTenantTSDBIdentifier{ - TS: parsedTS, - From: model.Time(from), - Through: model.Time(through), - Checksum: uint32(checksum), + exportTSInSecs: len(elems[0]) <= 10, + TS: parsedTS, + From: model.Time(from), + Through: model.Time(through), + Checksum: uint32(checksum), }, true } diff --git a/pkg/storage/stores/shipper/indexshipper/tsdb/identifier_test.go b/pkg/storage/stores/shipper/indexshipper/tsdb/identifier_test.go index 78452c98e076..41e202be5e46 100644 --- a/pkg/storage/stores/shipper/indexshipper/tsdb/identifier_test.go +++ b/pkg/storage/stores/shipper/indexshipper/tsdb/identifier_test.go @@ -20,10 +20,11 @@ func TestParseSingleTenantTSDBPath(t *testing.T) { desc: "simple_works", input: "1-compactor-1-10-ff.tsdb", id: SingleTenantTSDBIdentifier{ - TS: time.Unix(1, 0), - From: 1, - Through: 10, - Checksum: 255, + exportTSInSecs: true, + TS: time.Unix(1, 0), + From: 1, + Through: 10, + Checksum: 255, }, ok: true, }, @@ -31,10 +32,11 @@ func TestParseSingleTenantTSDBPath(t *testing.T) { desc: "simple_works_with_nanosecond", input: "1712534400000000000-compactor-1-10-ff.tsdb", id: SingleTenantTSDBIdentifier{ - TS: time.Unix(0, 1712534400000000000), - From: 1, - Through: 10, - Checksum: 255, + exportTSInSecs: false, + TS: time.Unix(0, 1712534400000000000), + From: 1, + Through: 10, + Checksum: 255, }, ok: true, }, @@ -42,10 +44,11 @@ func TestParseSingleTenantTSDBPath(t *testing.T) { desc: "uint32_max_checksum_works", input: fmt.Sprintf("1-compactor-1-10-%x.tsdb", math.MaxUint32), id: SingleTenantTSDBIdentifier{ - TS: time.Unix(1, 0), - From: 1, - Through: 10, - Checksum: math.MaxUint32, + exportTSInSecs: true, + TS: time.Unix(1, 0), + From: 1, + Through: 10, + Checksum: math.MaxUint32, }, ok: true, }, @@ -69,6 +72,9 @@ func TestParseSingleTenantTSDBPath(t *testing.T) { id, ok := ParseSingleTenantTSDBPath(tc.input) require.Equal(t, tc.ok, ok) require.Equal(t, tc.id, id) + if ok { + require.Equal(t, tc.input, id.Name()) + } }) } }