private async Task <CreateResult> CreateWithParents(CreateRequest request) { while (true) { var parentPath = ZooKeeperPath.GetParentPath(request.Path); if (parentPath == null) { return(CreateResult.Unsuccessful( ZooKeeperStatus.BadArguments, request.Path, new ArgumentException($"Can't get parent path for `{request.Path}`"))); } var result = await CreateAsync(new CreateRequest(parentPath, CreateMode.Persistent)).ConfigureAwait(false); if (!result.IsSuccessful && result.Status != ZooKeeperStatus.NodeAlreadyExists) { return(CreateResult.Unsuccessful(result.Status, request.Path, result.Exception)); } result = await ExecuteOperation(new CreateOperation(request)).ConfigureAwait(false); if (result.Status != ZooKeeperStatus.NodeNotFound) { return(result); } // Note(kungurtsev): someone has deleted our parent since we checked, create it again. } }
public void Start_should_check_that_beacon_has_started() { var zkClient = Substitute.For <IZooKeeperClient>(); zkClient.CreateAsync(Arg.Any <CreateRequest>()).Returns(Task.FromResult(CreateResult.Unsuccessful(ZooKeeperStatus.AuthFailed, "", null))); application = new PortRequiresApplication(); host = new VostokHost( new TestHostSettings( application, s => { SetupEnvironment(s); s.SetupZooKeeperClient(zkSetup => zkSetup.UseInstance(zkClient)); s.SetupServiceBeacon( beaconSetup => beaconSetup.SetupReplicaInfo( replicaInfoSetup => { replicaInfoSetup.SetApplication("auth-test"); })); }) { BeaconRegistrationWaitEnabled = true, BeaconRegistrationTimeout = 2.Seconds() }); Action checkStart = () => host.Start(); checkStart.Should().Throw <Exception>().Where(e => e.Message.Contains("beacon hasn't registered")); host.ApplicationState.Should().Be(VostokApplicationState.CrashedDuringInitialization); }