Compare arrivals at a barrier against the expected count and turn the pending count into a release, wait, or escalate remediation action.

barrier pending The expected count and arrivals are scalars, so the pending work that drives the remediation action stays deterministic without waiting on a live barrier.

WaitGroup Barrier Remediation Report

arrivals
waitgroup_barrier_remediation_report.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

func main() {
	var arrivals = 3
	expected := 3
	done := arrivals
	if done > expected {
		done = expected
	}
	pending := expected - done
	var action string
	if pending == 0 {
		action = "release"
	} else if pending <= 1 {
		action = "wait"
	} else {
		action = "escalate"
	}
	fmt.Printf("expected=%d done=%d pending=%d %s\n", expected, done, pending, action)
}
package main

import "fmt"

func main() {
	var arrivals = 0
	expected := 3
	done := arrivals
	if done > expected {
		done = expected
	}
	pending := expected - done
	var action string
	if pending == 0 {
		action = "release"
	} else if pending <= 1 {
		action = "wait"
	} else {
		action = "escalate"
	}
	fmt.Printf("expected=%d done=%d pending=%d %s\n", expected, done, pending, action)
}
package main

import "fmt"

func main() {
	var arrivals = 2
	expected := 3
	done := arrivals
	if done > expected {
		done = expected
	}
	pending := expected - done
	var action string
	if pending == 0 {
		action = "release"
	} else if pending <= 1 {
		action = "wait"
	} else {
		action = "escalate"
	}
	fmt.Printf("expected=%d done=%d pending=%d %s\n", expected, done, pending, action)
}
  1. arrivals ← 3, expected ← 3, done ← 3, pending ← 0, action ← ""

    5func main() {6  var arrivals→ 3 = 3 //@arrivals=2, 07  expected→ 3 := 38  done→ 3 := arrivals39  if done > expected {10    done = expected11  }12  pending→ 0 := expected3 - done313  var action→ "" string14  if pending == 0 {
  2. action ← "release"

    13var action string14if pending0 == 0 {15  action→ "release" = "release"16} else if pending <= 1 {
  3. fmt.Printf("expected=%d done=%d pending=%d %s ", expected, done, pendi…

    20  }21  fmt.Printf("expected=%d done=%d pending=%d %s\n", expected3, done3, pending0, action"release")22}
    outputexpected=3 done=3 pending=0 release
  1. arrivals ← 0, expected ← 3, done ← 0, pending ← 3, action ← ""

    5func main() {6  var arrivals→ 0 = 07  expected→ 3 := 38  done→ 0 := arrivals09  if done > expected {10    done = expected11  }12  pending→ 3 := expected3 - done013  var action→ "" string14  if pending == 0 {
  2. action ← "escalate"

    17  action = "wait"18} else {19  action→ "escalate" = "escalate"20}
  3. fmt.Printf("expected=%d done=%d pending=%d %s ", expected, done, pendi…

    20  }21  fmt.Printf("expected=%d done=%d pending=%d %s\n", expected3, done0, pending3, action"escalate")22}
    outputexpected=3 done=0 pending=3 escalate
  1. arrivals ← 2, expected ← 3, done ← 2, pending ← 1, action ← ""

    5func main() {6  var arrivals→ 2 = 27  expected→ 3 := 38  done→ 2 := arrivals29  if done > expected {10    done = expected11  }12  pending→ 1 := expected3 - done213  var action→ "" string14  if pending == 0 {
  2. action ← "wait"

    15  action = "release"16} else if pending1 <= 1 {17  action→ "wait" = "wait"18} else {
  3. fmt.Printf("expected=%d done=%d pending=%d %s ", expected, done, pendi…

    20  }21  fmt.Printf("expected=%d done=%d pending=%d %s\n", expected3, done2, pending1, action"wait")22}
    outputexpected=3 done=2 pending=1 wait