func()

in processor/lsmintervalprocessor/internal/merger/limits/tracker.go [324:367]


func (t *Trackers) Unmarshal(d []byte) error {
	if len(d) == 0 {
		return nil
	}

	var (
		offset              int
		latestScopeTracker  *ScopeTracker
		latestMetricTracker *MetricTracker
	)
	for offset < len(d) {
		trackerTyp := trackerType(d[offset])
		offset += 1

		// The below code will panic with NPE if the binary encoding is
		// unexpected. The expected binary encoding must have one resource
		// tracker then scope tracker followed by metric tracker followed by
		// datapoint tracker.
		var tracker *Tracker
		switch trackerTyp {
		case resourceTrackerType:
			tracker = t.GetResourceTracker()
		case scopeTrackerType:
			latestScopeTracker = t.NewScopeTracker()
			tracker = latestScopeTracker.Tracker
			// Nil the previous metric tracker as we expect a new metric
			// tracker for the new scope.
			latestMetricTracker = nil
		case metricTrackerType:
			latestMetricTracker = latestScopeTracker.NewMetricTracker()
			tracker = latestMetricTracker.Tracker
		case dpTrackerType:
			tracker = latestMetricTracker.NewDatapointTracker()
		default:
			return errors.New("invalid tracker found")
		}
		n, err := tracker.Unmarshal(d[offset:])
		if err != nil {
			return err
		}
		offset += n
	}
	return nil
}