Commit Graph

67 Commits

Author SHA1 Message Date
tidwall 23b016d192 Fix excessive memory usage for objects with TTLs
This commit fixes an issue where Tile38 was using lots of extra
memory to track objects that are marked to expire. This was
creating problems with applications that set big TTLs.

How it worked before:

Every collection had a unique hashmap that stores expiration
timestamps for every object in that collection. Along with
the hashmaps, there's also one big server-wide list that gets
appended every time a new SET+EX is performed.

From a background routine, this list is looped over at least
10 times per second and is randomly searched for potential
candidates that might need expiring. The routine then removes
those entries from the list and tests if the objects matching
the entries have actually expired. If so, these objects are
deleted them from the database. When at least 25% of
the 20 candidates are deleted the loop is immediately
continued, otherwise the loop backs off with a 100ms pause.

Why this was a problem.

The list grows one entry for every SET+EX. When TTLs are long,
like 24-hours or more, it would take at least that much time
before the entry is removed. So for databased that have objects
that use TTLs and are updated often this could lead to a very
large list.

How it was fixed.

The list was removed and the hashmap is now search randomly. This
required a new hashmap implementation, as the built-in Go map
does not provide an operation for randomly geting entries. The
chosen implementation is a robinhood-hash because it provides
open-addressing, which makes for simple random bucket selections.

Issue #502
2019-10-29 11:19:33 -07:00
tidwall 5abadd72a3 Updated geoindex 2019-09-19 11:30:49 -07:00
tidwall 639f6e2deb Replaced boxtree for rbang 2019-09-12 18:42:53 -07:00
tidwall 54f14d8b03 Updated gjson library 2019-08-15 06:08:38 -07:00
tidwall 85b70e0d26 Updated geojson package 2019-06-28 10:01:12 -07:00
tidwall 3ae59274e3 Removed evio option 2019-04-26 11:50:49 -07:00
Josh Baker 55a175c767
Merge pull request #430 from tidwall/sqs-update
SQS Credentials Updates
2019-03-14 12:50:53 -07:00
tidwall 5ae1a76450 Updated dependencies 2019-03-14 09:55:31 -07:00
tidwall 4e656ad19b Fixed nearby inaccuracy with geofence
Closes #431
2019-03-12 14:38:05 -07:00
tidwall 3e64497a51 Update aws-sdk-go package 2019-03-11 09:18:55 -07:00
tidwall 30f903bd51 Require properties member for geojson features 2019-02-12 06:49:13 -07:00
tidwall 92c1ce8ef9 Update tinybtree dep 2019-02-11 13:39:29 -07:00
Steven Wolfe 1e775bf59b Adding ARM and ARM64 packages 2019-01-14 12:38:11 -07:00
Steve Lacy 74809188f6
Update geojson dependency 2019-01-10 09:37:20 -07:00
tidwall c75a144b83 Fixed MultiPolygon intersect failure
close #394
2018-12-03 17:19:18 -07:00
tidwall d8b813a423 Added redigo vendor 2018-12-03 16:12:55 -07:00
tidwall 1bdc2135d7 Update geojson vendor 2018-11-11 09:33:58 -07:00
tidwall a160fa0860 wip: cricle 2018-11-11 09:05:26 -07:00
tidwall 44edf52f97 Updated benchmark tool 2018-11-11 09:05:11 -07:00
tidwall 372744b192 More hacking vendored circle.go 2018-11-11 09:04:00 -07:00
tidwall edf5d22095 Hack geojson circle.go 2018-11-11 09:03:47 -07:00
tidwall 0cd6d164d6 Update evio 2018-11-05 12:07:18 -07:00
Alex Roitman 949371fcd9 Update geojson 2018-11-01 13:49:39 -07:00
tidwall e577f60481 Updated redigo imports 2018-10-29 05:00:54 -07:00
tidwall 555e47036c Replaced net package with evio
- Added threads startup flag
- Replaced net package with evio
- Refactored controller into server
2018-10-28 15:51:47 -07:00
tidwall 745579b56b Updated geojson packages 2018-10-27 09:23:29 -07:00
Alex Roitman 33530075a4 Use new Meters() function. 2018-10-25 17:00:19 -07:00
tidwall b1370332e6 Always use compressed indexing 2018-10-23 11:23:55 -07:00
tidwall a9a1612972 Update geojson package 2018-10-22 05:40:56 -07:00
tidwall 7cc4008442 Added multiple indexing kinds 2018-10-21 19:08:56 -07:00
tidwall 3e41a2ecce Update gjson/sjson 2018-10-18 06:30:41 -07:00
tidwall cc75cf22a8 Fix #369 poly in hole query 2018-10-18 06:28:31 -07:00
tidwall 1544f2914d Fix Circle type 2018-10-16 08:55:26 -07:00
tidwall 6257ddba78 Faster point in polygon / GeoJSON updates
The big change is that the GeoJSON package has been completely
rewritten to fix a few of geometry calculation bugs, increase
performance, and to better follow the GeoJSON spec RFC 7946.

GeoJSON updates

- A LineString now requires at least two points.
- All json members, even foreign, now persist with the object.
- The bbox member persists too but is no longer used for geometry
  calculations. This is change in behavior. Previously Tile38 would
  treat the bbox as the object's physical rectangle.
- Corrections to geometry intersects and within calculations.

Faster spatial queries

- The performance of Point-in-polygon and object intersect operations
  are greatly improved for complex polygons and line strings. It went
  from O(n) to roughly O(log n).
- The same for all collection types with many children, including
  FeatureCollection, GeometryCollection, MultiPoint, MultiLineString,
  and MultiPolygon.

Codebase changes

- The pkg directory has been renamed to internal
- The GeoJSON internal package has been moved to a seperate repo at
  https://github.com/tidwall/geojson. It's now vendored.

Please look out for higher memory usage for datasets using complex
shapes. A complex shape is one that has 64 or more points. For these
shapes it's expected that there will be increase of least 54 bytes per
point.
2018-10-13 04:30:48 -07:00
tidwall f17e95c6b6 Merge branch 'nats-endpoint' of https://github.com/lennycampino/tile38 into lennycampino-nats-endpoint 2018-08-08 18:29:22 -07:00
Lenny-Campino Hartmann 2f076524d4 fixed vendor fetch 2018-08-07 21:24:46 +02:00
Lenny-Campino Hartmann 4cae040470 Added go-nats to vendor 2018-08-07 21:21:35 +02:00
tidwall 1d78a41e41 Added BoxTree 2018-08-02 19:57:11 -07:00
Josh Baker 0aa04a1910 vendor lotsa package 2018-04-09 08:55:22 -07:00
Josh Baker 5753f3dc43 updated vendor for aws 2017-10-05 15:31:53 -07:00
Lenny Hartmann d6fe2eec96 Sqs endpoint (#221)
* test

* undo test

* Added aws SQS endpoint

* Added aws vendor

* Bug fixes

* enabled NOCOPY in build.sh
2017-10-05 14:08:03 -07:00
Alex Roitman b55300b729 Lua scripting feature. (#224)
* Start on lua scripting

* Implement evalsha, script load, script exists, and script flush

* Type conversions from lua to resp/json.
Refactor to make luastate and luascripts persistent in the controller.

* Change controller.command and all underlying commands to return resp.Value.
Serialize only during the ouput.

* First stab at tile38 call from lua

* Change tile38 into tile38.call in Lua

* Property return errors from scripts

* Minor refactoring.  No locking on script run

* Cleanup/refactoring

* Create a pool of 5 lua states, allow for more as needed. Refactor.

* Use safe map for scripts.  Add a limit for max number of lua states.  Refactor.

* Refactor

* Refactor script commands into atomic, read-only, and non-atomic classes.
Proper locking for all three classes.
Add tests for scripts

* More tests for scripts

* Properly escape newlines in lua-produced errors

* Better test for readonly failure

* Correctly convert ok/err messages between lua and resp.
Add pcall, sha1hex, error_reply, status_reply functions to tile38 namespace in lua.

* Add pcall test. Change writeErr to work with string argument

* Make sure eval/evalsha never attempt to write AOF

* Add eval-set and eval-get to benchmarks

* Fix eval benchmark tests, add more

* Improve benchmarks

* Optimizations and refactoring.

* Add lua memtest

* Typo

* Add dependency

* golint fixes

* gofmt fixes

* Add scripting commands to the core/commands.json

* Use ARGV for args inside lua
2017-10-05 08:20:40 -07:00
Josh Baker 26d0083faf Update vendoring to use golang/dep
commit a1a37d335a8e89ac89d85c00c8585d3fc02e064a
Author: Josh Baker <joshbaker77@gmail.com>
Date:   Thu Oct 5 07:36:54 2017 -0700

    use symlink instead of copy

commit 96399c2c92620f633611c778e5473200bfd48d41
Author: Josh Baker <joshbaker77@gmail.com>
Date:   Thu Oct 5 07:19:26 2017 -0700

    use dep for vendoring
2017-10-05 07:40:19 -07:00
Josh Baker d817814200 Optimized pipelining
Performance gains for pipelining commands over the network.
Using tile38-benchmark and the -P flag it's possible to see 2x-10x boost
in requests per second.
2017-09-30 19:34:25 -07:00
Josh Baker 033f782a84 update redbench 2017-09-30 13:07:39 -07:00
Josh Baker d6936636c2 updated gjson 2017-09-29 18:10:12 -07:00
Josh Baker b1da3a1ea5 Merge branch 'mqtt-endpoint' of https://github.com/m1ome/tile38 into m1ome-mqtt-endpoint 2017-09-04 07:22:25 -07:00
Josh Baker cd057088d9 index optimizations 2017-08-10 17:32:40 -07:00
Josh Baker 300635727a apply LIMIT after WHERE clause, fix #199 2017-07-24 08:26:48 -07:00
Josh Baker 6008a78281 vendored redbench 2017-03-31 08:31:33 -07:00