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