f7358424e4
* maybe_gc/2 is triggered at machi_file_proxy, when chunk is deleted and the file is larger than `max_file_size` * A file is deleted if all chunks except 1024 bytes header are trimmed * If a file is going to be deleted, file_proxy notifies metadata_mgr to remember the filename persistently, whose filename is `known_files_<FluName>` * Such trimmed filenames are stored in a machi_plist file per flu * machi_file_proxy could not be started if the filename is in the manager's list. Consequently, any write, read and trim operations cannot happen against deleted file. * After the file was trimmed, any read request to the file returns `{error, trimmed}` * Disclaimer: no tests written yet and machi_plist does not support any recovery from partial writes. * Add some thoughts as comments for repairing trims. * State diagram of every byte is as follows: ``` state\action| write/append | read_chunk | trim_chunk ------------+----------------+------------------+--------------- unwritten | -> written | fail (+repair) | -> trimmed written | noop or repair | return content | -> trimmed trimmed | fail | fail | noop ```
17 lines
524 B
Erlang
17 lines
524 B
Erlang
-module(machi_plist_test).
|
|
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
|
|
open_close_test() ->
|
|
FileName = "bark-bark-one",
|
|
file:delete(FileName),
|
|
{ok, PList0} = machi_plist:open(FileName, []),
|
|
{ok, PList1} = machi_plist:add(PList0, "boomar"),
|
|
?assertEqual(["boomar"], machi_plist:all(PList1)),
|
|
ok = machi_plist:close(PList1),
|
|
|
|
{ok, PList2} = machi_plist:open(FileName, []),
|
|
?assertEqual(["boomar"], machi_plist:all(PList2)),
|
|
ok = machi_plist:close(PList2),
|
|
file:delete(FileName),
|
|
ok.
|