OLD | NEW |
1 package main | 1 package main |
2 | 2 |
3 // Test integration of gkvlite with go-slab, using gkvlite's optional | 3 // Test integration of gkvlite with go-slab, using gkvlite's optional |
4 // ItemAddRef/ItemDecRef() callbacks to integrate with a slab memory | 4 // ItemAddRef/ItemDecRef() callbacks to integrate with a slab memory |
5 // allocator. | 5 // allocator. |
6 | 6 |
7 import ( | 7 import ( |
8 "bytes" | 8 "bytes" |
9 "flag" | 9 "flag" |
10 "fmt" | 10 "fmt" |
11 "io" | 11 "io" |
12 "log" | 12 "log" |
13 "math/rand" | 13 "math/rand" |
14 "os" | 14 "os" |
15 "sort" | 15 "sort" |
16 "testing" | 16 "testing" |
17 "unsafe" | |
18 | 17 |
19 "github.com/luci/gkvlite" | 18 "github.com/luci/gkvlite" |
20 "github.com/steveyen/go-slab" | 19 "github.com/steveyen/go-slab" |
21 ) | 20 ) |
22 | 21 |
23 var maxOps = flag.Int("ops", 0, | 22 var maxOps = flag.Int("ops", 0, |
24 "max number of ops; 0 means run forever") | 23 "max number of ops; 0 means run forever") |
25 var maxItems = flag.Int("n", 10000, | 24 var maxItems = flag.Int("n", 10000, |
26 "max number of items") | 25 "max number of items") |
27 var maxItemBytes = flag.Int("maxItemBytes", 20000, | 26 var maxItemBytes = flag.Int("maxItemBytes", 20000, |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 return nil | 159 return nil |
161 } | 160 } |
162 itemAlloc := func(c *gkvlite.Collection, keyLength uint32) *gkvlite.Item
{ | 161 itemAlloc := func(c *gkvlite.Collection, keyLength uint32) *gkvlite.Item
{ |
163 var n *ItemNode | 162 var n *ItemNode |
164 if freeItemNodes != nil { | 163 if freeItemNodes != nil { |
165 n = freeItemNodes | 164 n = freeItemNodes |
166 freeItemNodes = freeItemNodes.next | 165 freeItemNodes = freeItemNodes.next |
167 n.next = nil | 166 n.next = nil |
168 } else { | 167 } else { |
169 n = &ItemNode{} | 168 n = &ItemNode{} |
170 » » » n.item.Transient = unsafe.Pointer(n) | 169 » » » n.item.Transient = n |
171 } | 170 } |
172 if n.refs != 0 || | 171 if n.refs != 0 || |
173 n.item.Key != nil || n.item.Val != nil || n.item.Priorit
y != 0 || | 172 n.item.Key != nil || n.item.Val != nil || n.item.Priorit
y != 0 || |
174 » » » n.item.Transient != unsafe.Pointer(n) { | 173 » » » n.item.Transient != n { |
175 panic("unexpected ItemNode refs or item fields") | 174 panic("unexpected ItemNode refs or item fields") |
176 } | 175 } |
177 n.refs = 1 | 176 n.refs = 1 |
178 n.next = nil | 177 n.next = nil |
179 n.item.Key = arena.Alloc(int(keyLength)) | 178 n.item.Key = arena.Alloc(int(keyLength)) |
180 return &n.item | 179 return &n.item |
181 } | 180 } |
182 itemAddRef := func(c *gkvlite.Collection, i *gkvlite.Item) { | 181 itemAddRef := func(c *gkvlite.Collection, i *gkvlite.Item) { |
183 » » n := (*ItemNode)(i.Transient) | 182 » » n := i.Transient.(*ItemNode) |
184 n.refs++ | 183 n.refs++ |
185 } | 184 } |
186 itemDecRef := func(c *gkvlite.Collection, i *gkvlite.Item) { | 185 itemDecRef := func(c *gkvlite.Collection, i *gkvlite.Item) { |
187 » » n := (*ItemNode)(i.Transient) | 186 » » n := i.Transient.(*ItemNode) |
188 n.refs-- | 187 n.refs-- |
189 if n.refs == 0 { | 188 if n.refs == 0 { |
190 if i.Key == nil { | 189 if i.Key == nil { |
191 panic("expected a Key") | 190 panic("expected a Key") |
192 } | 191 } |
193 arena.DecRef(i.Key) | 192 arena.DecRef(i.Key) |
194 i.Key = nil | 193 i.Key = nil |
195 if i.Val != nil { | 194 if i.Val != nil { |
196 arena.DecRef(i.Val) | 195 arena.DecRef(i.Val) |
197 i.Val = nil | 196 i.Val = nil |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 for _, k := range mk { | 350 for _, k := range mk { |
352 log.Printf("%s = %d", k, arenaStats[k]) | 351 log.Printf("%s = %d", k, arenaStats[k]) |
353 } | 352 } |
354 } | 353 } |
355 log.Printf("i: %d, numGets: %d, numSets: %d, numDeletes:
%d"+ | 354 log.Printf("i: %d, numGets: %d, numSets: %d, numDeletes:
%d"+ |
356 ", numEvicts: %d, numReopens: %d, numFlushes: %d
\n", | 355 ", numEvicts: %d, numReopens: %d, numFlushes: %d
\n", |
357 i, numGets, numSets, numDeletes, numEvicts, numR
eopens, numFlushes) | 356 i, numGets, numSets, numDeletes, numEvicts, numR
eopens, numFlushes) |
358 } | 357 } |
359 } | 358 } |
360 } | 359 } |
OLD | NEW |