All Versions
Latest Version
Avg Release Cycle
11 days
Latest Release
674 days ago

Changelog History
Page 1

  • v0.16.2 Changes

    October 09, 2020
    • โž• added MultiPrepareBuilder for creating MultiPrepare instance for MultiMap from Java.
    • ๐Ÿ“‡ renamed Bag.Less to Glass and Bag.less instance to Glass being a transparent type.
    • โœ‚ removed redundant BAG[_] type param from getKeyValueDeadline functions
    • โฌ†๏ธ bumped ZIO version to 1.0.2
  • v0.16.1 Changes

    October 05, 2020

    ๐Ÿš€ Release overview

    • ๐Ÿ‘Œ Improved SkipList implementation for faster writes and atomic reads
    • โœ‚ Removed snapshotting LevelZero state for reads.

    ๐Ÿ‘Œ Improved write performance for sequential writes

    Implemented a faster NavigableMap (for SequentialOrder writes) backed by Array and binary-search which can be enabled for applications that only require sequential writes and do not need random writes.

    The following shows benchmarks of SequentialOrder (Array) vs RandomOrder (java.ConcurrentSkipListMap) for sequential writes.


    How to optimise SwayDB for SequentialOrder writes?

    0๏ธโƒฃ Default setting optimises writes for RandomOrder. The following code samples optimise writes for SequentialOrder.

    initialSkipListLength sets the length of the Array since SequentialOrder is backed by Array.


    Map\<Integer, String, Void\> map =MemoryMap .functionsOff(Default.intSerializer(), Default.stringSerializer()) .setOptimiseWrites(OptimiseWrites.sequentialOrder(10000)) .get();


    val map = memory.Map[Int, String, Nothing, Bag.Less]( optimiseWrites = OptimiseWrites.SequentialOrder(initialSkipListLength = 10000) )

    Atomic SkipList reads

    Previously SkipList required copying in-memory key-values for atomicity (#124). Now LevelZero performs atomic reads without copying.

    0๏ธโƒฃ Default setting disables Atomic which can be enabled with the following.


    Map\<Integer, String, Void\> map =MemoryMap .functionsOff(Default.intSerializer(), Default.stringSerializer()) .setAtomic(Atomic.on()) .get();


    val map = memory.Map[Int, String, Nothing, Bag.Less](atomic = Atomic.On)

    โœ‚ Removed snapshotting

    ๐ŸŒฒ Previously reads were creating a snapshot which provided the state of write-ahead-log files in LevelZero for each read. Now snapshotting happen lazily (Stream like) as the read progresses. This change was aimed to further minimise GC workload.

  • v0.16 Changes

    September 20, 2020

    ๐Ÿš€ This release was focused on

    • ๐ŸŽ MultiMap & Compaction performance improvements.
    • Completing Java API.
    • โœ… QA and Usability testing.
    • ๐Ÿ‘Œ Support for Boopickle serialisation.
    • ๐Ÿš€ Resolving issues labeled Production release.

    MultiMap and SetMap Java types

    MultiMap and SetMap are now implemented for Java. Java API is now complete.

    MultiMap allows creating deeply nested Map.

    //create a root mapMultiMap\<String, Integer, String, Void\> root =MemoryMultiMap.functionsOff( stringSerializer(), //nested Map key type intSerializer(), //key type stringSerializer() //value type ).get();//first child mapMultiMap\<String, Integer, String, Void\> child1 = root.child("first child"); child1.put(1, "child1's value 1");

    ๐Ÿ‘€ SetMap provides Map like API for Set. Useful for application that always fetch the value with the key. It stores both key & value in the same location for faster seeks and reduced IOps.

    SetMap\<Integer, String\> setMap =MemorySetMap .config(intSerializer(), stringSerializer()) .get(); setMap.put(1, "one");

    ๐Ÿ‘Œ Improved MultiMap performance and reduced storage cost

    ๐ŸŽ MultiMap previously stored parent key bytes within child key bytes. Now deeply nested Map do not have any extra storage cost over a root MultiMap. This also improved read and write performance.

    ๐ŸŽ Deeply nested MultiMap has constant performance regardless of the depth.

    Access to all nested child MultiMap nodes

    //get all children of root mapStream\<MultiMap\<String, Integer, String, Void\>\> children = root.children();//get all children of root map and all it's grand children. Stream\<MultiMap\<String, Integer, String, Void\>\> child = root.childrenFlatten();


    Shorter syntax for enabling functions


    Create functions without need to specify the return type. All java functions types are under PureFunctionJava.

    //function that appends "updated" to old valueOnValue\<Integer, String\> myFunction = (String value) -\>Apply.update(value + " updated");

    Register the function as a List.

    Map\<Integer, String, PureFunction\<Integer, String, Apply.Map\<String\>\>\> map =PersistentMap .functionsOn( Paths.get("my\_map"), //directoryDefault.intSerializer(), //key serialiserDefault.stringSerializer(), //value serializwrArrays.asList(myFunction) //functions list ).get();


    Syntax shortened for enabling functions - PureFunction.Map[Int, String]. All Scala function types are under PureFunctionScala.

    val map = persistent.Map[Int, String, PureFunction.Map[Int, String], Bag.Less]("my\_map")

    To register function supply implicit functions List.

    //sample function that appends "updated" to old valueval myFunction: OnValue[String] = (value: String) =\> Apply.Update(value + " updated")implicit val myFunctions = Functions[PureFunction.Map[Int, String]](myFunction)

    โž• Added new function types

    • OnKey - reads the key
    • OnKeyDeadline (Scala) & OnKeyExpiration (Java) - reads the key and deadline
    • OnKeyValue - reads the key and value
    • OnValue - reads the value
    • OnValueDeadline (Scala) & OnValueExpiration (Java) - reads the value and deadline
    • OnKeyValueValueDeadline (Scala) & OnKeyValueValueExpiration (Java) - read the key, value and deadline.

    ๐Ÿ‘Œ Improve Serialisers


    ๐Ÿ— Use Slice<T> to easily build custom serialisers. ByteOps.Java removes the need to cast java.lang.Byte to scala.Byte.

    new Serializer\<String\>() { @Overridepublic Slice\<Byte\> write(String data) { return Slice.writeStringUTF8(data, ByteOps.Java()); } @Overridepublic String read(Slice\<Byte\> slice) { return slice.readStringUTF8(ByteOps.Java()); } };


    Easily serialise case classes using Bookpickle

    import swaydb.\_import boopickle.Default.\_case class MyClass(id: Int, value: String)implicit val serialiser = swaydb.serializers.BooPickle[MyClass]val set = memory.Set[MyClass, Nothing, Bag.Less]()

    ๐Ÿ‘ Better Scala and Java interop

    Scala functions can be shared with Java and vice versa. Scala instance can also be accessed from Java.

    Set\<Integer, Void\> mySet =MemorySet .functionsOff(intSerializer()) .get(); mySet.asScala(); //get scala set

    Validating missing functions

    Missing applied functions reported on re-boot to ensure safe startups.

    ๐Ÿ‘ป > swaydb.Exception$MissingFunctions: Missing 1 function. List("myFunction").

    Flags for clearing applied functions

    Functions that are applied can be cleared by setting the clearAppliedFunctionsOnBoot flag.


    val map = persistent.Set[Int, PureFunction.Set[Int], Bag.Less]("my\_set", clearAppliedFunctionsOnBoot = true)


    Set\<Integer, PureFunction\<Integer, Void, Apply.Set\<Void\>\>\> mySet =PersistentSet .functionsOn(Paths.get("my\_set"), intSerializer(), Arrays.asList()) .setClearAppliedFunctionsOnBoot(true) .get();

    ๐Ÿ— Build Validator - Error reporting

    Incompatible SwayDB version files get reported on boot-up.

    Eg: Current v0.16 is incompatible with older versions so start v0.16 on older versions will result in the following error

    Incompatible versions! SwayDB v0.16 is not compatible with files created by v0.15

    Directories are type-checked. Eg: starting Set on a Map directory will yield

    Invalid data type Set for the directory of type Map.

  • v0.15 Changes

    September 08, 2020
    • Streams created from data-types (Map, Set, Queue ... ) use the bag from within the data-type.
    • โž• added eventually.persistent.SetMap
    • โž• added added eventually.persistent.Queue
    • โž• added file which stores the version and used to perform compatibility checks.
    • MultiMap is not experimental anymore.

    ๐Ÿ’ฅ Breaking change - with the addition of file, previous versions are incompatible with this version.

  • v0.14.7 Changes

    September 03, 2020

    Resolved issues

    #260 - Rename MapConfig, SetConfig & QueueConfig in Java to reflect their storage types
    ๐Ÿšš #259 - Remove Function type param from SetMap
    #258 - Java's is returning Stream instead of Source
    #257 - Add asJava to interop with java.util.Map
    #256 - Terminate Bag on close
    #255 - Implement Source for Stream
    #253 - Add Stream.materializeBuilder for custom collection type
    โœ… #252 - SwayDBExpireSpec test failing

  • v0.14.6 Changes

    August 28, 2020

    ๐Ÿš€ This release fixes issues relating to memory-mapped files not working on Windows and other important issues.

    ๐Ÿ #156 - program won't end (resolved) & java.nio.file.AccessDeniedException on Windows
    ๐ŸŽ #251 - [WINDOWS] - MappedByteBuffer.force is extremely slow on Windows Performance
    #250 - Compaction does not progress on reboot - ArrayIndexOutOfBoundsException
    #249 - ByteBufferSweeper Actor can be a basic Actor

    ๐Ÿ See issue #156 for more details on new ForceSave and MMAP configurations to handle memory-mapped files on Windows.

  • v0.14.5 Changes

    August 24, 2020

    Resolves important issues.

    • #248 - Disallow api calls after close or delete
    • #247 - Releasing FileLock does not close channel
    • โฑ #246 - Scheduler should be internal to the Actor
    • #245 - Memory mapped files result in "Too many opened files"
    • #243 - BufferCleaner should be passed explicitly
    • #242 - Terminate all Actors and Cache on Shutdown
    • #241 - terminateAndRecover function for Actor
  • v0.14.4 Changes

    August 09, 2020

    ๐Ÿ— #240 - java and data-java modules should not disable cross builds.

    ๐Ÿš€ Reverts change made to java artifact id in previous release - v0.14.3.

    \<dependency\> \<groupId\>io.swaydb\</groupId\> \<artifactId\>java\_2.13\</artifactId\> \<version\>0.14.4\</version\> \</dependency\>
  • v0.14.3 Changes

    August 09, 2020

    Resolves following bugs.

    โšก๏ธ #238 - LevelZero's compaction is not updating Maps.currentMapsSlice safely
    #236 - Stream returns missing results when transitioning level0 entries to level1 for databases with mapSize = 1.byte
    #237 - Actor pauses processing messages
    0๏ธโƒฃ #239 - Convenience functions for Java to overwrite default Configs parameters from Scala.

    Java's artifactId changed to java instead of java_2.13

    Maven dependency looks like

    \<dependency\> \<groupId\>io.swaydb\</groupId\> \<artifactId\>java\</artifactId\> \<version\>0.14.3\</version\> \</dependency\>
  • v0.14.2 Changes

    August 01, 2020

    ๐Ÿ›  Fixes

    #237 - Actor pauses processing messages