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.
            }
        }
예제 #2
0
        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);
        }