Переглянути джерело

Bug fixes

* Spin wait on page pool to avoid deadlock.
* Fix bug whereby we erroneously test whether the number of paged items
  exceeds Count() when the API endpoint only ever returns a zero count.
Jonathan D. Storm 1 день тому
батько
коміт
9deb78e6be
1 змінених файлів з 23 додано та 20 видалено
  1. 23 20
      v6/depager.go

+ 23 - 20
v6/depager.go

@@ -111,28 +111,31 @@ func (p *pager[T]) iteratePages() <-chan Page[T] {
 			if p.ctx.Err() != nil {
 				break
 			}
-			page = <-p.pagePool
-			err := p.client.NextPage(page, p.m*p.n)
-			if err != nil {
-				p.err = err
-				p.pagePool <- page
-				return
-			}
-			if p.cnt == 0 {
-				p.cnt = page.Count()
-			}
-			// When page.Count() is zero, we must rely on the
-			// absence of returned results to know when to stop.
-			if p.cnt == 0 && len(page.Elems()) == 0 {
-				p.pagePool <- page
-				return
-			}
-			ch <- page
+			select {
+			case page = <-p.pagePool:
+				err := p.client.NextPage(page, p.m*p.n)
+				if err != nil {
+					p.err = err
+					p.pagePool <- page
+					return
+				}
+				if p.cnt == 0 {
+					p.cnt = page.Count()
+				}
+				// When page.Count() is zero, we must rely on the
+				// absence of returned results to know when to stop.
+				if p.cnt == 0 && len(page.Elems()) == 0 {
+					p.pagePool <- page
+					return
+				}
+				ch <- page
 
-			if (p.m*p.n + p.n) >= p.cnt {
-				return
+				if p.cnt != 0 && (p.m*p.n+p.n) >= p.cnt {
+					return
+				}
+				p.m++
+			default:
 			}
-			p.m++
 		}
 	}()
 	return ch