func (vm *VarManager) TopologyChanged(topology *configuration.Topology, done func(bool)) { resultChan := make(chan struct{}) enqueued := vm.exe.Enqueue(func() { if od := vm.onDisk; od != nil { vm.onDisk = nil od(false) } vm.Topology = topology oldRollAllowed := vm.RollAllowed if !vm.RollAllowed { vm.RollAllowed = topology == nil || !topology.NextBarrierReached1(vm.RMId) } server.Log("VarManager", fmt.Sprintf("%p", vm), "rollAllowed:", oldRollAllowed, "->", vm.RollAllowed, fmt.Sprintf("%p", topology)) goingToDisk := topology != nil && topology.NextBarrierReached1(vm.RMId) && !topology.NextBarrierReached2(vm.RMId) doneWrapped := func(result bool) { close(resultChan) done(result) } if goingToDisk { vm.onDisk = doneWrapped vm.checkAllDisk() } else { server.Log("VarManager", fmt.Sprintf("%p", vm), "calling done", fmt.Sprintf("%p", topology)) doneWrapped(true) } }) if enqueued { go vm.exe.WithTerminatedChan(func(terminated chan struct{}) { select { case <-resultChan: case <-terminated: select { case <-resultChan: default: done(false) } } }) } else { done(false) } }