From 9d3f9da5ad770231c44de17fbe70336b95f6ad0e Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin <valyala@gmail.com>
Date: Thu, 15 Jul 2021 12:16:45 +0300
Subject: [PATCH] lib/storage: make sure the second call to DeduplicateSamples
 and deduplicateSamplesDuringMerge doesnt change samples

---
 lib/storage/dedup_test.go | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/lib/storage/dedup_test.go b/lib/storage/dedup_test.go
index a17813a161..a3f0d88bbb 100644
--- a/lib/storage/dedup_test.go
+++ b/lib/storage/dedup_test.go
@@ -68,6 +68,16 @@ func TestDeduplicateSamples(t *testing.T) {
 		if j != len(timestampsCopy) {
 			t.Fatalf("superfluous timestamps found starting from index %d: %v", j, timestampsCopy[j:])
 		}
+
+		// Verify that the second call to DeduplicatSamples doesn't modify samples.
+		valuesCopy := append([]float64{}, values...)
+		timestampsCopy, valuesCopy = DeduplicateSamples(timestampsCopy, valuesCopy)
+		if !reflect.DeepEqual(timestampsCopy, timestampsExpected) {
+			t.Fatalf("invalid DeduplicateSamples(%v) timestamps for the second call;\ngot\n%v\nwant\n%v", timestamps, timestampsCopy, timestampsExpected)
+		}
+		if !reflect.DeepEqual(valuesCopy, values) {
+			t.Fatalf("invalid DeduplicateSamples(%v) values for the second call;\ngot\n%v\nwant\n%v", timestamps, values, valuesCopy)
+		}
 	}
 	f(time.Millisecond, nil, []int64{})
 	f(time.Millisecond, []int64{123}, []int64{123})
@@ -118,6 +128,16 @@ func TestDeduplicateSamplesDuringMerge(t *testing.T) {
 		if j != len(timestampsCopy) {
 			t.Fatalf("superfluous timestamps found starting from index %d: %v", j, timestampsCopy[j:])
 		}
+
+		// Verify that the second call to DeduplicatSamples doesn't modify samples.
+		valuesCopy := append([]int64{}, values...)
+		timestampsCopy, valuesCopy = deduplicateSamplesDuringMerge(timestampsCopy, valuesCopy)
+		if !reflect.DeepEqual(timestampsCopy, timestampsExpected) {
+			t.Fatalf("invalid deduplicateSamplesDuringMerge(%v) timestamps for the second call;\ngot\n%v\nwant\n%v", timestamps, timestampsCopy, timestampsExpected)
+		}
+		if !reflect.DeepEqual(valuesCopy, values) {
+			t.Fatalf("invalid deduplicateSamplesDuringMerge(%v) values for the second call;\ngot\n%v\nwant\n%v", timestamps, values, valuesCopy)
+		}
 	}
 	f(time.Millisecond, nil, []int64{})
 	f(time.Millisecond, []int64{123}, []int64{123})