Merge pull request #361 from vkd/v4

fix iterator across empty pages
This commit is contained in:
Vladimir Mihailenco 2016-09-08 16:48:19 +03:00 committed by GitHub
commit 788a36eee7
2 changed files with 47 additions and 17 deletions

View File

@ -46,25 +46,32 @@ func (it *ScanIterator) Next() bool {
return true return true
} }
// Return if there is more data to fetch. for {
if it.ScanCmd.cursor == 0 { // Return if there is no more data to fetch.
return false if it.ScanCmd.cursor == 0 {
} return false
}
// Fetch next page. // Fetch next page.
if it.ScanCmd._args[0] == "scan" { if it.ScanCmd._args[0] == "scan" {
it.ScanCmd._args[1] = it.ScanCmd.cursor it.ScanCmd._args[1] = it.ScanCmd.cursor
} else { } else {
it.ScanCmd._args[2] = it.ScanCmd.cursor it.ScanCmd._args[2] = it.ScanCmd.cursor
} }
it.ScanCmd.reset() it.ScanCmd.reset()
it.client.process(it.ScanCmd) it.client.process(it.ScanCmd)
if it.ScanCmd.Err() != nil { if it.ScanCmd.Err() != nil {
return false return false
} }
it.pos = 1 it.pos = 1
return len(it.ScanCmd.page) > 0
// Redis can occasionally return empty page
if len(it.ScanCmd.page) > 0 {
return true
}
}
return false
} }
// Val returns the key/field at the current cursor position. // Val returns the key/field at the current cursor position.

View File

@ -21,6 +21,18 @@ var _ = Describe("ScanIterator", func() {
return err return err
} }
var extraSeed = func(n int, m int) error {
pipe := client.Pipeline()
for i := 1; i <= m; i++ {
pipe.Set(fmt.Sprintf("A%02d", i), "x", 0).Err()
}
for i := 1; i <= n; i++ {
pipe.Set(fmt.Sprintf("K%02d", i), "x", 0).Err()
}
_, err := pipe.Exec()
return err
}
var hashKey = "K_HASHTEST" var hashKey = "K_HASHTEST"
var hashSeed = func(n int) error { var hashSeed = func(n int) error {
pipe := client.Pipeline() pipe := client.Pipeline()
@ -110,4 +122,15 @@ var _ = Describe("ScanIterator", func() {
Expect(vals).To(HaveLen(13)) Expect(vals).To(HaveLen(13))
}) })
It("should scan with match across empty pages", func() {
Expect(extraSeed(2, 10)).NotTo(HaveOccurred())
var vals []string
iter := client.Scan(0, "K*", 1).Iterator()
for iter.Next() {
vals = append(vals, iter.Val())
}
Expect(iter.Err()).NotTo(HaveOccurred())
Expect(vals).To(HaveLen(2))
})
}) })