// vim: set sw=2 sts=2 :
digraph {
  rankdir=BT
  bgcolor=white

  node [shape=plaintext]
  node [fontcolor=black]

  StandAlone     [ style=filled,fillcolor=gray,label=StandAlone ]

  node [fontcolor=lightgray]

  Unconnected    [ label=Unconnected ]

  CommTrouble [ shape=record,
    label="{communication loss|{Timeout|BrokenPipe|NetworkFailure}}" ]

  node [fontcolor=gray]

  subgraph cluster_try_connect {
    label="try to connect, handshake"
    rank=max
    WFConnection   [ label=WFConnection ]
    WFReportParams [ label=WFReportParams ]
  }

  TearDown       [ label=TearDown ]

  Connected      [ label=Connected,style=filled,fillcolor=green,fontcolor=black ]

  node [fontcolor=lightblue]

  StartingSyncS  [ label=StartingSyncS ]
  StartingSyncT  [ label=StartingSyncT ]

  subgraph cluster_bitmap_exchange {
    node [fontcolor=red]
    fontcolor=red
    label="new application (WRITE?) requests blocked\lwhile bitmap is exchanged"

    WFBitMapT      [ label=WFBitMapT ]
    WFSyncUUID     [ label=WFSyncUUID ]
    WFBitMapS      [ label=WFBitMapS ]
  }

  node [fontcolor=blue]

  cluster_resync [ shape=record,label="{<any>resynchronisation process running\l'concurrent' application requests allowed|{{<T>PausedSyncT\nSyncTarget}|{<S>PausedSyncS\nSyncSource}}}" ]

  node [shape=box,fontcolor=black]

  // drbdadm [label="drbdadm connect"]
  // handshake [label="drbd_connect()\ndrbd_do_handshake\ndrbd_sync_handshake() etc."]
  // comm_error [label="communication trouble"]

  //
  // edges
  // --------------------------------------

  StandAlone -> Unconnected [ label="drbdadm connect" ]
  Unconnected -> StandAlone  [ label="drbdadm disconnect\lor serious communication trouble" ]
  Unconnected -> WFConnection [ label="receiver thread is started" ]
  WFConnection -> WFReportParams [ headlabel="accept()\land/or                        \lconnect()\l" ]

  WFReportParams -> StandAlone [ label="during handshake\lpeers do not agree\labout something essential" ]
  WFReportParams -> Connected [ label="data identical\lno sync needed",color=green,fontcolor=green ]

    WFReportParams -> WFBitMapS
    WFReportParams -> WFBitMapT
    WFBitMapT -> WFSyncUUID [minlen=0.1,constraint=false]

      WFBitMapS -> cluster_resync:S
      WFSyncUUID -> cluster_resync:T

  edge [color=green]
  cluster_resync:any -> Connected [ label="resnyc done",fontcolor=green ]

  edge [color=red]
  WFReportParams -> CommTrouble
  Connected -> CommTrouble
  cluster_resync:any -> CommTrouble
  edge [color=black]
  CommTrouble -> Unconnected [label="receiver thread is stopped" ]

}
