From d2ed8cb0b2135accabdd57fdf625d488a87c0668 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Sun, 22 Sep 2019 18:54:17 +0300 Subject: [PATCH] lib/storage: generate the first tag->metricIDs item in a mergeset block with a single metricID The first item from each mergeset block goes into index (lib/mergeset.blockHeader), so it must be short in order to reduce index size. --- lib/storage/index_db.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/storage/index_db.go b/lib/storage/index_db.go index 43d5e73925..0736023232 100644 --- a/lib/storage/index_db.go +++ b/lib/storage/index_db.go @@ -2369,7 +2369,21 @@ func (tmm *tagToMetricIDsRowsMerger) flushPendingMetricIDs(dstData []byte, dstIt dstData = mp.Tag.Marshal(dstData) // Use sort.Sort instead of sort.Slice in order to reduce memory allocations sort.Sort(&tmm.pendingMetricIDs) - for _, metricID := range tmm.pendingMetricIDs { + pendingMetricIDs := tmm.pendingMetricIDs + if len(dstItems) == 0 { + // Put the first item with a single metricID, since this item goes into index, so it must be short. + dstData = encoding.MarshalUint64(dstData, pendingMetricIDs[0]) + dstItems = append(dstItems, dstData[dstDataLen:]) + pendingMetricIDs = pendingMetricIDs[1:] + if len(pendingMetricIDs) == 0 { + tmm.pendingMetricIDs = tmm.pendingMetricIDs[:0] + return dstData, dstItems + } + dstDataLen = len(dstData) + dstData = marshalCommonPrefix(dstData, nsPrefixTagToMetricIDs, mp.AccountID, mp.ProjectID) + dstData = mp.Tag.Marshal(dstData) + } + for _, metricID := range pendingMetricIDs { dstData = encoding.MarshalUint64(dstData, metricID) } tmm.pendingMetricIDs = tmm.pendingMetricIDs[:0]