From 578dd2f800d85eabbd8e528fc7dc673626f61a13 Mon Sep 17 00:00:00 2001
From: Garet Halliday <me@garet.holiday>
Date: Thu, 14 Sep 2023 13:34:16 -0500
Subject: [PATCH] it was "discard all" all along

---
 lib/middleware/middlewares/eqp/state.go |   9 +-
 lib/util/ring/ring.go                   |   6 +
 lib/util/ring/ring_test.go              | 203 ++++++++++++++++--------
 test/tester_test.go                     |   2 +-
 4 files changed, 143 insertions(+), 77 deletions(-)

diff --git a/lib/middleware/middlewares/eqp/state.go b/lib/middleware/middlewares/eqp/state.go
index cebb92fe..ea122f63 100644
--- a/lib/middleware/middlewares/eqp/state.go
+++ b/lib/middleware/middlewares/eqp/state.go
@@ -192,10 +192,7 @@ func (T *State) ReadyForQuery(packet fed.Packet) {
 	}
 
 	// all pending has failed
-	for _, ok := T.pendingPreparedStatements.PopBack(); ok; _, ok = T.pendingPreparedStatements.PopBack() {
-	}
-	for _, ok := T.pendingPortals.PopBack(); ok; _, ok = T.pendingPortals.PopBack() {
-	}
-	for _, ok := T.pendingCloses.PopBack(); ok; _, ok = T.pendingCloses.PopBack() {
-	}
+	T.pendingPreparedStatements.Clear()
+	T.pendingPortals.Clear()
+	T.pendingCloses.Clear()
 }
diff --git a/lib/util/ring/ring.go b/lib/util/ring/ring.go
index 2ba40039..1753b3d9 100644
--- a/lib/util/ring/ring.go
+++ b/lib/util/ring/ring.go
@@ -117,6 +117,12 @@ func (r *Ring[T]) PopBack() (T, bool) {
 	return r.buf[r.tail], true
 }
 
+func (r *Ring[T]) Clear() {
+	r.head = 0
+	r.tail = 0
+	r.length = 0
+}
+
 func (r *Ring[T]) PushFront(value T) {
 	r.decHead()
 	r.buf[r.head] = value
diff --git a/lib/util/ring/ring_test.go b/lib/util/ring/ring_test.go
index 84149fcc..cf71b870 100644
--- a/lib/util/ring/ring_test.go
+++ b/lib/util/ring/ring_test.go
@@ -8,7 +8,7 @@ import (
 func assertSome[T comparable](t *testing.T, f func() (T, bool), value T) {
 	v, ok := f()
 	if !ok {
-		t.Error("expected items but got nothing")
+		t.Error("expected items but go nothing")
 		return
 	}
 	if v != value {
@@ -25,26 +25,6 @@ func assertNone[T any](t *testing.T, f func() (T, bool)) {
 	}
 }
 
-func assertGetSome[T comparable](t *testing.T, ring *Ring[T], index int, value T) {
-	v, ok := ring.Get(index)
-	if !ok {
-		t.Error("expected items but got nothing")
-		return
-	}
-	if v != value {
-		t.Error("expected", value, "but got", v)
-		return
-	}
-}
-
-func assertGetNone[T comparable](t *testing.T, ring *Ring[T], index int) {
-	v, ok := ring.Get(index)
-	if ok {
-		t.Error("expected nothing but got", v)
-		return
-	}
-}
-
 func assertLength[T any](t *testing.T, ring *Ring[T], length int) {
 	l := ring.Length()
 	if length != l {
@@ -59,21 +39,6 @@ func assertCapacity[T any](t *testing.T, ring *Ring[T], capacity int) {
 	}
 }
 
-func TestRing_Get(t *testing.T) {
-	r := new(Ring[int])
-	r.PushBack(2)
-	r.PushBack(3)
-	r.PushBack(4)
-	r.PushFront(1)
-	assertGetSome(t, r, 0, 1)
-	assertGetSome(t, r, 1, 2)
-	assertGetSome(t, r, 2, 3)
-	assertGetSome(t, r, 3, 4)
-	r.PopBack()
-	assertGetNone(t, r, 3)
-	assertGetNone(t, r, -1)
-}
-
 func TestRing_New(t *testing.T) {
 	r := new(Ring[int])
 	r.PushBack(1)
@@ -248,6 +213,25 @@ func TestRing_SmashBackward(t *testing.T) {
 	assertLength(t, &r, 0)
 }
 
+func TestRing_Clear(t *testing.T) {
+	var r Ring[int]
+	r.PushFront(1)
+	r.PushBack(2)
+	r.PushFront(3)
+	r.PushBack(4)
+
+	assertLength(t, &r, 4)
+
+	r.Clear()
+
+	assertLength(t, &r, 0)
+
+	assertNone(t, r.PopFront)
+	assertNone(t, r.PopBack)
+
+	assertLength(t, &r, 0)
+}
+
 func BenchmarkFIFO_Ring(b *testing.B) {
 	b.ReportAllocs()
 	ring := MakeRing[int](0, 16)
@@ -263,13 +247,27 @@ func BenchmarkFIFO_Ring(b *testing.B) {
 	}
 
 	for i := 0; i < b.N; i++ {
-		for j := 0; j < 10; j++ {
-			ring.PushBack(j)
-		}
-
-		for j := 0; j < 10; j++ {
-			assert(j)
-		}
+		ring.PushBack(1)
+		ring.PushBack(2)
+		ring.PushBack(3)
+		ring.PushBack(4)
+		ring.PushBack(5)
+		ring.PushBack(6)
+		ring.PushBack(7)
+		ring.PushBack(8)
+		ring.PushBack(9)
+		ring.PushBack(10)
+
+		assert(1)
+		assert(2)
+		assert(3)
+		assert(4)
+		assert(5)
+		assert(6)
+		assert(7)
+		assert(8)
+		assert(9)
+		assert(10)
 	}
 }
 
@@ -286,14 +284,37 @@ func BenchmarkFIFO_StdRing(b *testing.B) {
 	}
 
 	for i := 0; i < b.N; i++ {
-		for j := 0; j < 10; j++ {
-			ring.Value = j
-			ring = ring.Next()
-		}
-
-		for j := 0; j < 10; j++ {
-			assert(j)
-		}
+		ring.Value = 1
+		ring = ring.Next()
+		ring.Value = 2
+		ring = ring.Next()
+		ring.Value = 3
+		ring = ring.Next()
+		ring.Value = 4
+		ring = ring.Next()
+		ring.Value = 5
+		ring = ring.Next()
+		ring.Value = 6
+		ring = ring.Next()
+		ring.Value = 7
+		ring = ring.Next()
+		ring.Value = 8
+		ring = ring.Next()
+		ring.Value = 9
+		ring = ring.Next()
+		ring.Value = 10
+		ring = ring.Next()
+
+		assert(1)
+		assert(2)
+		assert(3)
+		assert(4)
+		assert(5)
+		assert(6)
+		assert(7)
+		assert(8)
+		assert(9)
+		assert(10)
 	}
 }
 
@@ -315,14 +336,28 @@ func BenchmarkFIFO_Slice(b *testing.B) {
 
 	for i := 0; i < b.N; i++ {
 		// pushing is easy for slices
-		for j := 0; j < 10; j++ {
-			slice = append(slice, j)
-		}
+		slice = append(slice, 1)
+		slice = append(slice, 2)
+		slice = append(slice, 3)
+		slice = append(slice, 4)
+		slice = append(slice, 5)
+		slice = append(slice, 6)
+		slice = append(slice, 7)
+		slice = append(slice, 8)
+		slice = append(slice, 9)
+		slice = append(slice, 10)
 
 		// popping is a bit more complicated
-		for j := 0; j < 10; j++ {
-			assert(j)
-		}
+		assert(1)
+		assert(2)
+		assert(3)
+		assert(4)
+		assert(5)
+		assert(6)
+		assert(7)
+		assert(8)
+		assert(9)
+		assert(10)
 	}
 }
 
@@ -343,14 +378,28 @@ func BenchmarkFIFO_Slice2(b *testing.B) {
 
 	for i := 0; i < b.N; i++ {
 		// pushing is easy for slices
-		for j := 0; j < 10; j++ {
-			slice = append(slice, j)
-		}
+		slice = append(slice, 1)
+		slice = append(slice, 2)
+		slice = append(slice, 3)
+		slice = append(slice, 4)
+		slice = append(slice, 5)
+		slice = append(slice, 6)
+		slice = append(slice, 7)
+		slice = append(slice, 8)
+		slice = append(slice, 9)
+		slice = append(slice, 10)
 
 		// popping is a bit more complicated
-		for j := 0; j < 10; j++ {
-			assert(j)
-		}
+		assert(1)
+		assert(2)
+		assert(3)
+		assert(4)
+		assert(5)
+		assert(6)
+		assert(7)
+		assert(8)
+		assert(9)
+		assert(10)
 	}
 }
 
@@ -370,12 +419,26 @@ func BenchmarkFIFO_Channel(b *testing.B) {
 
 	for i := 0; i < b.N; i++ {
 		// channel is the easiest interface by far
-		for j := 0; j < 10; j++ {
-			channel <- j
-		}
-
-		for j := 0; j < 10; j++ {
-			assert(j)
-		}
+		channel <- 1
+		channel <- 2
+		channel <- 3
+		channel <- 4
+		channel <- 5
+		channel <- 6
+		channel <- 7
+		channel <- 8
+		channel <- 9
+		channel <- 10
+
+		assert(1)
+		assert(2)
+		assert(3)
+		assert(4)
+		assert(5)
+		assert(6)
+		assert(7)
+		assert(8)
+		assert(9)
+		assert(10)
 	}
 }
diff --git a/test/tester_test.go b/test/tester_test.go
index 8b2580c3..6d7468aa 100644
--- a/test/tester_test.go
+++ b/test/tester_test.go
@@ -47,7 +47,7 @@ func TestTester(t *testing.T) {
 		Password: password,
 	}
 
-	for i := 0; i < 10; i++ {
+	for i := 0; i < 1; i++ {
 		var g gat.PoolsMap
 		p := pool.NewPool(transaction.Apply(pool.Options{
 			Credentials: creds,
-- 
GitLab