Eternal

Build Status Coverage Status Hex.pm Version Documentation

Eternal is a simple way to monitor an ETS table to ensure that it never dies. It works by using bouncing GenServers to ensure that both an owner and heir are always available, via the use of scheduled monitoring and message passing. The idea is similar to that of the Immortal library, but taking it further to ensure a more bulletproof solution - and removing the need to have a single process dedicated to owning your ETS table.

Installation

Eternal is available on Hex. You can install the package via:

  1. Add eternal to your list of dependencies in mix.exs:

        def deps do
          [{:eternal, "~> 1.0.0"}]
        end
        ```
    
  2. Ensure eternal is started before your application:

        def application do
          [applications: [:eternal]]
        end
        ```
    

Usage

The API of Eternal is quite small in order to reduce the risk of potential crashes (as that would cause you to lose your ETS tables). The main function you need is simply Eternal.new/3, which behaves in a similar way to :ets.new/2. The first two arguments are identical to :ets.new/2, and the latter is just a Keyword List of options to configure Eternal (this argument is optional).

iex> Eternal.new(:table_name, [ :set, { :read_concurrency, true }])
126995
iex> Eternal.new(:table_name, [ :named_table, :set, { :read_concurrency, true }])
:table_name

The returned value is the id of your ETS table (remember if you want the name, you have to provide the :named_table option). You can use this returned value to interact safely with ETS, and Eternal will monitor your table in the background.

For further usage examples, please see the documentation.

Contributions

If you feel something can be improved, or have any questions about certain behaviours or pieces of implementation, please feel free to file an issue. Proposed changes should be taken to issues before any PRs to avoid wasting time on code which might not be merged upstream.

Credits

Thanks to the following for the inspiration for this project: