@ -1738,24 +1738,23 @@ func (*Head) String() string {
}
func ( h * Head ) getOrCreate ( hash uint64 , lset labels . Labels , pendingCommit bool ) ( * memSeries , bool , error ) {
// Just using `getOrCreateWithID` below would be semantically sufficient, but we'd create
// a new series on every sample inserted via Add(), which causes allocations
// and makes our series IDs rather random and harder to compress in postings.
s := h . series . getByHash ( hash , lset )
if s != nil {
return s , false , nil
}
// Optimistically assume that we are the first one to create the series.
id := chunks . HeadSeriesRef ( h . lastSeriesID . Inc ( ) )
return h . getOrCreateWithID ( id , hash , lset , pendingCommit )
return h . getOrCreateWithOptionalID ( 0 , hash , lset , pendingCommit )
}
func ( h * Head ) getOrCreateWithID ( id chunks . HeadSeriesRef , hash uint64 , lset labels . Labels , pendingCommit bool ) ( * memSeries , bool , error ) {
// If id is zero, one will be allocated.
func ( h * Head ) getOrCreateWithOptionalID ( id chunks . HeadSeriesRef , hash uint64 , lset labels . Labels , pendingCommit bool ) ( * memSeries , bool , error ) {
if preCreationErr := h . series . seriesLifecycleCallback . PreCreation ( lset ) ; preCreationErr != nil {
return nil , false , preCreationErr
}
if id == 0 {
// Note this id is wasted in the case where a concurrent operation creates the same series first.
id = chunks . HeadSeriesRef ( h . lastSeriesID . Inc ( ) )
}
shardHash := uint64 ( 0 )
if h . opts . EnableSharding {