Merge branch 'master' into collection-optz

This commit is contained in:
tidwall 2019-03-10 10:56:56 -07:00
commit a6aa83cab0
3 changed files with 47 additions and 9 deletions

View File

@ -254,9 +254,9 @@ A bounding box consists of two points. The first being the southwestern most poi
set fleet truck1 bounds 30 -110 40 -100 set fleet truck1 bounds 30 -110 40 -100
``` ```
#### Geohash #### Geohash
A [geohash](https://en.wikipedia.org/wiki/Geohash) is a string respresentation of a point. With the length of the string indicating the precision of the point. A [geohash](https://en.wikipedia.org/wiki/Geohash) is a string representation of a point. With the length of the string indicating the precision of the point.
``` ```
set fleet truck1 hash 9tbnthxzr # this would be equivlent to 'point 33.5123 -112.2693' set fleet truck1 hash 9tbnthxzr # this would be equivalent to 'point 33.5123 -112.2693'
``` ```
#### GeoJSON #### GeoJSON
@ -272,7 +272,7 @@ set city tempe object {"type":"Polygon","coordinates":[[[0,0],[10,10],[10,0],[0,
#### XYZ Tile #### XYZ Tile
An XYZ tile is rectangle bounding area on earth that is represented by an X, Y coordinate and a Z (zoom) level. An XYZ tile is rectangle bounding area on earth that is represented by an X, Y coordinate and a Z (zoom) level.
Check out [maptiler.org](https://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/) for an interactive example. Check out [maptiler.org](http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/) for an interactive example.
#### QuadKey #### QuadKey
A QuadKey used the same coordinate system as an XYZ tile except that the string representation is a string characters composed of 0, 1, 2, or 3. For a detailed explanation checkout [The Bing Maps Tile System](https://msdn.microsoft.com/en-us/library/bb259689.aspx). A QuadKey used the same coordinate system as an XYZ tile except that the string representation is a string characters composed of 0, 1, 2, or 3. For a detailed explanation checkout [The Bing Maps Tile System](https://msdn.microsoft.com/en-us/library/bb259689.aspx).

View File

@ -1,6 +1,8 @@
package collection package collection
import ( import (
"runtime"
ifbtree "github.com/tidwall/btree" ifbtree "github.com/tidwall/btree"
"github.com/tidwall/geojson" "github.com/tidwall/geojson"
"github.com/tidwall/geojson/geo" "github.com/tidwall/geojson/geo"
@ -10,6 +12,9 @@ import (
"github.com/tidwall/tile38/internal/collection/rtree" "github.com/tidwall/tile38/internal/collection/rtree"
) )
// yieldStep forces the iterator to yield goroutine every N steps.
const yieldStep = 0xFF
// Cursor allows for quickly paging through Scan, Within, Intersects, and Nearby // Cursor allows for quickly paging through Scan, Within, Intersects, and Nearby
type Cursor interface { type Cursor interface {
Offset() uint64 Offset() uint64
@ -280,6 +285,9 @@ func (c *Collection) Scan(desc bool, cursor Cursor,
if count <= offset { if count <= offset {
return true return true
} }
if count&yieldStep == yieldStep {
runtime.Gosched()
}
if cursor != nil { if cursor != nil {
cursor.Step(1) cursor.Step(1)
} }
@ -310,6 +318,9 @@ func (c *Collection) ScanRange(start, end string, desc bool, cursor Cursor,
if count <= offset { if count <= offset {
return true return true
} }
if count&yieldStep == yieldStep {
runtime.Gosched()
}
if cursor != nil { if cursor != nil {
cursor.Step(1) cursor.Step(1)
} }
@ -350,6 +361,9 @@ func (c *Collection) SearchValues(desc bool, cursor Cursor,
if count <= offset { if count <= offset {
return true return true
} }
if count&yieldStep == yieldStep {
runtime.Gosched()
}
if cursor != nil { if cursor != nil {
cursor.Step(1) cursor.Step(1)
} }
@ -382,6 +396,9 @@ func (c *Collection) SearchValuesRange(start, end string, desc bool,
if count <= offset { if count <= offset {
return true return true
} }
if count&yieldStep == yieldStep {
runtime.Gosched()
}
if cursor != nil { if cursor != nil {
cursor.Step(1) cursor.Step(1)
} }
@ -422,6 +439,9 @@ func (c *Collection) ScanGreaterOrEqual(id string, desc bool,
if count <= offset { if count <= offset {
return true return true
} }
if count&yieldStep == yieldStep {
runtime.Gosched()
}
if cursor != nil { if cursor != nil {
cursor.Step(1) cursor.Step(1)
} }
@ -544,6 +564,9 @@ func (c *Collection) Within(
if count <= offset { if count <= offset {
return false, true return false, true
} }
if count&yieldStep == yieldStep {
runtime.Gosched()
}
if cursor != nil { if cursor != nil {
cursor.Step(1) cursor.Step(1)
} }
@ -560,6 +583,9 @@ func (c *Collection) Within(
if count <= offset { if count <= offset {
return true return true
} }
if count&yieldStep == yieldStep {
runtime.Gosched()
}
if cursor != nil { if cursor != nil {
cursor.Step(1) cursor.Step(1)
} }
@ -594,6 +620,9 @@ func (c *Collection) Intersects(
if count <= offset { if count <= offset {
return false, true return false, true
} }
if count&yieldStep == yieldStep {
runtime.Gosched()
}
if cursor != nil { if cursor != nil {
cursor.Step(1) cursor.Step(1)
} }
@ -610,6 +639,9 @@ func (c *Collection) Intersects(
if count <= offset { if count <= offset {
return true return true
} }
if count&yieldStep == yieldStep {
runtime.Gosched()
}
if cursor != nil { if cursor != nil {
cursor.Step(1) cursor.Step(1)
} }
@ -667,6 +699,9 @@ func (c *Collection) Nearby(
if count <= offset { if count <= offset {
return true return true
} }
if count&yieldStep == yieldStep {
runtime.Gosched()
}
if cursor != nil { if cursor != nil {
cursor.Step(1) cursor.Step(1)
} }

View File

@ -785,6 +785,7 @@ func (server *Server) watchLuaStatePool() {
} }
} }
// backgroundSyncAOF ensures that the aof buffer is does not grow too big.
func (server *Server) backgroundSyncAOF() { func (server *Server) backgroundSyncAOF() {
t := time.NewTicker(time.Second) t := time.NewTicker(time.Second)
defer t.Stop() defer t.Stop()
@ -792,12 +793,14 @@ func (server *Server) backgroundSyncAOF() {
if server.stopServer.on() { if server.stopServer.on() {
return return
} }
server.mu.Lock() func() {
if len(server.aofbuf) > 0 { server.mu.Lock()
server.flushAOF(true) defer server.mu.Unlock()
} if len(server.aofbuf) > 0 {
server.aofbuf = nil server.flushAOF(true)
server.mu.Unlock() }
server.aofbuf = nil
}()
} }
} }