mnesia no disk write after restart
Michael McDaniel
erlang@REDACTED
Mon Apr 17 23:42:08 CEST 2006
Now that I realize that it is my observer program gumming
up mnesia's gears, I have looked closer at the command I
was using with my other (working) module. Aha! different.
Here is the observation command I need to use to not break
mnesia:
erl -sname fu -mnesia extra_db_nodes [module_nodename@REDACTED] \
-s file script checkblock -s init stop
where "[module_nodename@REDACTED]" is the module's -sname
on this host (i.e. the module which created and 'owns' the db).
I am grateful for any insight on the particular point of why
'-config sys.config' breaks mnesia, though. Even though it
specifies the mnesia directory, I am only reading the db.
~Michael
On Mon, Apr 17, 2006 at 02:11:17PM -0700, Michael McDaniel wrote:
>
> I changed the record name from ip to ipm with same behaviour.
>
> What I *did* find, though is that the following sequence causes
> the problem:
>
> 1) start module as described below (in original post)
>
> 2) enter records as described below (in original post)
>
> 3) from command line run:
> erl -sname fu -config sys.config -s file script checkblock \
> -s erlang halt
>
> where checkblock contains:
>
> mnesia:start().
> timer:sleep(200).
> mnesia:wait_for_tables([ip,schema], 7000) ,
> X = block:dirty_sorted_list_table_localtime().
> Z = global:registered_names().
> io:format('~p~n~p entries~nregistered names: ~p~n', [X, length(X), Z]).
> mnesia:stop().
>
> and sys.config contents are described below (in original post)
>
> 4) stop/restart module and no records get written to disk. Actually,
> if I do step '3' above before the first records get written to disk
> then they never will (get written).
>
> The contents of block:dirty_sorted_list_table_localtime() is:
>
> dirty_sorted_list_table_localtime() ->
> io:format('*** LOCAL time ***~n',[]) ,
> lists:keysort(5, ?MODULE:dlt_localtime()) .
>
> and dlt_localtime() is:
>
> dlt_localtime() ->
> [ {element(1, X), element(2,X), element(3,X), element(4,X),
> calendar:universal_time_to_local_time(element(5,X)), element(6,X)}
> || X <- mnesia:dirty_match_object(ipm, {ipm, '_', '_', '_', '_', '_'})
> ] .
>
>
>
> So, it appears to be the heisenberg principal and the more I observerved,
> the less it worked.
>
> It appears that running step '3)' above causes mnesia to get confused
> about whether it should write to disk or ram; how can this be?
>
> Also, in original post I mentioned sending messages to module of what
> records to write. That is one method of entering records. During these
> tests, the module itself is reading the tail of a file and looking for
> patterns which triggers it to create a record and write to mnesia. So,
> I am only entering text into a file to trigger record writing. I
> mention this to eliminate conjecture that my sending process (there
> isn't one) is interfering with the module writing mnesia. If anything,
> it appears that my observation (step '3)') causes a permanent problem
> with mnesia and/or my module function.
>
> Now, the question is "why is this happening?". I need to be able to
> look at the db from an external program.
>
> Is there some other 'proper' way I should be checking the db contents?
>
> thanks,
>
> ~Michael
>
>
>
>
> On Mon, Apr 17, 2006 at 01:42:51AM -0700, Michael McDaniel wrote:
> > BRIEF: module using mnesia works fine the first time I start it
> > (when the schema and table get created), and the db is
> > persistent for the next restart. Henceforth, no records
> > write to disk, they only exist in memory, and further
> > restarts lose all but the records written on the initial
> > start (when the table was created).
> >
> >
> > LONG:
> >
> > My goal is a *persistent* database when restarting my module.
> >
> > I am running R10B-10 on Linux.
> >
> > I have abbreviated the following code. I think all the pertinent
> > bits are there.
> >
> > I start my module with the following fun:
> >
> >
> > start() ->
> >
> > erlang:set_cookie( node(), some_cookie )
> >
> > mnesia:create_schema([node()]) ,
> > mnesia:start() ,
> >
> >
> > case catch mnesia:table_info(?DB, attributes) of
> >
> > L when is_list(L) ->
> > ok ;
> >
> > _ ->
> > mnesia:create_table(?DB ,
> > [ {disc_copies, [node()]} ,
> > {attributes, record_info(fields, ?DB)} ,
> > {type, set}
> > ])
> >
> > end,
> >
> > mnesia:wait_for_tables([?DB,schema], 21000)
> > .
> >
> >
> > the write function is:
> >
> > write(Rec) ->
> > Trans = fun() -> mnesia:write(Rec) end ,
> > mnesia:transaction(Trans) ,
> > os:cmd("/bin/sync")
> > .
> >
> >
> > I run a loop that waits for messages of records to write.
> >
> > I start the module from a script containing:
> >
> >
> > #!/bin/sh
> >
> > HOST=`/bin/hostname`
> >
> > /bin/su mmcdanie -c "cd /home/erl ; /usr/local/bin/erl \
> > -sname ${HOST}_block -config /home/erl/sys.config \
> > -setcookie xus -env TERM linux -env HOME /home/erl \
> > -home /home/erl -heart -detached \
> > -s block start /var/log/auth"
> > #% end
> >
> >
> > and the contents of sys.config:
> >
> > [{mnesia, [{dir, "/home/erl/Mnesia.block"} ,
> > %% {debug, trace} ,
> > {schema_location, disc}]}].
> >
> >
> > I start the application the first time with no Mnesia.block
> > directory created. Module starts fine, directory and db files
> > are created, and I can send messages which get written to
> > the database. I see the .LOG file change and the record.DCL
> > file get created.
> >
> > I stop the module and restart it and I can see the records
> > in the database.
> >
> > I send more messages and the records get written though only
> > to memory. A new record.DCL file never gets created. The
> > .LOG file(s) never change. 'Never' is waiting for over 10
> > minutes (and {dump_log_time_threshold,180000}).
> >
> > I run mnesia:system_info from another node:
> >
> > (fu@REDACTED)2> mnesia:system_info().
> > ===> System info in version "4.2.5", debug level = none <===
> > disc. Directory "/home/erl/Mnesia.block" is used.
> > use fallback at restart = false
> > running db nodes = [www_block@REDACTED,fu@REDACTED]
> > stopped db nodes = []
> > master node tables = []
> > remote = [ip]
> > ram_copies = [schema]
> > disc_copies = []
> > disc_only_copies = []
> > [{fu@REDACTED,ram_copies},{www_block@REDACTED,disc_copies}] = [schema]
> > [{www_block@REDACTED,disc_copies}] = [ip]
> > 3 transactions committed, 0 aborted, 0 restarted, 0 logged to disc
> > 0 held locks, 0 in queue; 0 local transactions, 0 remote
> > 0 transactions waits for other nodes: []
> > yes
> >
> >
> > The '0 logged to disc' is after having written a new record that
> > does show in the database.
> >
> >
> > QUESTIONS:
> >
> > 1) Does anyone see something obvious I am overlooking here?
> >
> > 2) Any suggestions on what to do differently?
> >
> > 3) What is the next bit of information anyone needs to help?
> >
> >
> > thanks,
> >
> > ~Michael
> > P.S. I am doing essentially the same thing in another module
> > that I start from yaws and it works fine (i.e. persistent db
> > between restarts). I have not sleuthed out the cause of the
> > different behaviours! In the other module (that works) I do
> > not even have the case statement protecting the create_table/2
> > fun.
>
> --
> Michael McDaniel
> Portland, Oregon, USA
> http://autosys.us
> +1 503 283 5284
--
Michael McDaniel
Portland, Oregon, USA
http://autosys.us
+1 503 283 5284
More information about the erlang-questions
mailing list