コード例 #1
0
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)
	}
}