Per our language specification, unsafe literals are by their inherent
name literals, hence keep them under this variant. Also, it simplifies
a bunch of implementations. Although I'm sure we can do something for
performance to simply provide an error case when we encounter a
disallowed literal.
* Re-implement network stack
This commit does a complete overhaul to the networking subsystem, and this has
been pending for a long time. For whatever reason, when some generic
flexibility was aimed for, we went ahead with the "expensive emulation" of
async traits which has resulted in unnecessary complication with type arguments
(lifetimes, function signatures looking insane et cetera) besides the usual
downsides.
Also, the termination signaling mechanism was slightly excessive because it was
built with the idea of supporting PUB/SUB by default.
Last but not the least, the authentication system used dynamism which had
resulted in unwanted complication to type arguments for functions that accepted
the auth handle. Now, none of those complications exist and we have an almost
glorious life (for now atleast).
* Fix simple query header for Skyhash-1.0
This ensures that we always have an aligned pointer, even
when the slice is zero sized. This is required for enum
optimizations (as noted in from_raw_parts).
* Switch to using `SharedSlice`
Although I'm a huge fan of case-based optimizations, we don't exactly need the
sophistication that `Bytes` gives us. Instead, we switch to a traditional ref
counted structure, which allocates on creation and deallocates when it is the
only owner (bytes also does this albeit using dynamic dispath via a vft).
The same function path is utilized for every operation on the structure. The
difference between heap-allocating the shared state and having it as fields
on the base structure is a micro-optimization that I'm yet to substantiate
with performance gains.
* Add tests for `SharedSlice`
* Fix erroneous removal of auth table during tree cleanup
When it comes to the handling of system tables, the current storage engine has
a little "funk." It is because the limited flexibility of the format prevents
us from directly storing system tables which have a different structure than
ordinary user created tables; this is why when the cleanup is run, previously,
the dummy keyspace created for the PRELOAD was scanned and since it has nothing
any "alien" file in the `ks/system` directory was purged. This commit fixes
that and ensures that we do not clean up the system directory.
This is also another reason why a new storage engine coupled with a new memory
engine are being developed. These shortcomings will be addressed with the new
engines.
* Add test case for issue #276
Add Changelog entry
This commit re-implements the benchmark tool, doing a lot of refactoring and
speeding up things, while reducing memory usage. Some notes:
1. The `testkey` subcommand was removed. This was needed because it makes no
sense to have it with data types like lists. I'll leave support for creating
test data for another PR (if at all needed)
2. The bench tool now uses lesser memory "in a go." Previously, all the get,
set and update packets were generated in one single step. This is no longer
done. Instead, we generate the packets for one type, run its corresponding
tests and completely deallocate and cleanup once we're done with that test.
This helps alleviate memory usage.
3. Instead of going in the sequence (GET, SET, UPDATE, ...) and running that
set some n times, we now run each test n times, and repeat that for the other
tests. The advantage of this is code clarity.
4. Finally, more validation checks were added ensuring that the benchmark tool
very closely resembles a "real-life" scenario wherein a connection is picked up
from a pool by a thread, a task run-on and evaluated.
5. Better logging and error reporting: instead of vaguely crashing, the
benchmark tool provides more clarity on errors. However, panics in worker
threads are yet to be improved in terms of reporting.