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.