Mnesia not reading from disk on a new docker deployment (mix release)

Hi guys,

We have a phoenix application, deployed with mix releases inside docker.

We are trying to use mnesia (disk_copies) inside docker using volumes.

This is working fine when we deploy a new container and even on restarting the container. We can read/write from mnesia (from disk).

Below is the :mnesia.info output, we can see tables are in disk_copies

---> Active tables <--- 
Elixir.GamestateTimeTrial: with 0        records occupying 305      words of mem
Elixir.GamestateTrickShot: with 0        records occupying 305      words of mem
Elixir.GamestateClassic: with 0        records occupying 305      words of mem
schema         : with 4        records occupying 775      words of mem
===> System info in version "4.19.1", debug level = none <===
opt_disc. Directory "/home/elixir/app/mnesiadb" is used.
use fallback at restart = false
running db nodes   = [deadpool@7e1ae5afa43d]
stopped db nodes   = [] 
master node tables = []
remote             = []
ram_copies         = []
disc_copies        = ['Elixir.GamestateClassic','Elixir.GamestateTimeTrial',
                      'Elixir.GamestateTrickShot',schema]
disc_only_copies   = []
[{deadpool@7e1ae5afa43d,disc_copies}] = [schema,'Elixir.GamestateClassic',
                                         'Elixir.GamestateTrickShot',
                                         'Elixir.GamestateTimeTrial']
5 transactions committed, 0 aborted, 0 restarted, 6 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []
:ok

Now the issue is when we deploy a new container of same image (by stopping the old one), and same volume
mnesia is trying to read from ram_copies instead of disk_copies.

we can see disk_copies list is empty contrary to the previous output

---> Active tables <--- 
schema         : with 4        records occupying 775      words of mem
===> System info in version "4.19.1", debug level = none <===
opt_disc. Directory "/home/elixir/app/mnesiadb" is used.
use fallback at restart = false
running db nodes   = [deadpool@bf64da26fdbd]
stopped db nodes   = [deadpool@7e1ae5afa43d] 
master node tables = []
remote             = ['Elixir.GamestateClassic','Elixir.GamestateTimeTrial',
                      'Elixir.GamestateTrickShot']
ram_copies         = [schema]
disc_copies        = []
disc_only_copies   = []
[] = ['Elixir.GamestateTrickShot','Elixir.GamestateClassic',
      'Elixir.GamestateTimeTrial']
[{deadpool@bf64da26fdbd,ram_copies}] = [schema]
2 transactions committed, 3 aborted, 0 restarted, 0 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []
:ok

We can see here that the old stopped container is mentioned in stopped db nodes = [deadpool@7e1ae5afa43d] .

We tried copy tables to disk on every migrations with Mnesia.change_table_copy_type(GamestateClassic, node(), :disc_copies), but we got Tables doesn’t exist.

So basically on a new deployment of a docker image (ex after we do some changes in codebase) with existing volume, mnesia is not reading from disk_copies but works if we just restarts the container.

Any help is much appreciated.

2 Likes

This problem occurs because erlang uses the hostname as the node name. But in docker, the hostname changes on every new deployment. We can make the node name the same by adding a hostname to the docker container.

Found the answer here.

3 Likes