Erlang Digraph гарантирует атомарность и изоляцию - PullRequest
2 голосов
/ 02 апреля 2011

Описаны ли где-нибудь гарантии атомарности и изоляции орграфа?

Особенно:

  1. В каком состоянии другой процесс увидит орграф, если другой процесс попытается получить к нему доступ (vertices (), out_neighbours () и т.д.) в середине del_vertex: beforedel_vertex, в середине del_vertex (то есть вершина удалена, ребра не удалены или ребра удалены, вершина нет) или после del_vertex (то есть другой процесс будет заблокирован до завершения операции)?
  2. Тот же вопрос относительно del_vertices.

Если я правильно понимаю, орграф реализован с использованием 3 таблиц ETS.Есть ли дополнительный механизм блокировки между ними, чтобы результаты были согласованными?

1 Ответ

4 голосов
/ 03 апреля 2011

Глядя на источник digraph.erl, я не вижу никакой дополнительной блокировки.

del_vertex(G, V) ->
    do_del_vertex(V, G).

...

do_del_vertex(V, G) ->
    do_del_nedges(ets:lookup(G#digraph.ntab, {in, V}), G),
    do_del_nedges(ets:lookup(G#digraph.ntab, {out, V}), G),
    ets:delete(G#digraph.vtab, V).

Поэтому, когда вы смотрите на орграф с другогоВ процессе вы увидите следующие состояния в зависимости от времени:

  • Все до del_vertex/2
  • Некоторые ребра к и от вершины удалены
  • Сама вершинаудалено

То же самое происходит с вершиной после вершины для del_vertices/2.

Если вы хотите больше атомарности, создайте орграф protected и оберните его на своем собственном сервере, например gen_serverобычно реализуя часть функциональности, которая требует тесного доступа к орграфу.

...