예제 #1
0
        public void ImportSettings(string filename)
        {
            var jsonText    = File.ReadAllText(filename);
            var newSettings = PartialObject <BindableSettings> .Create(jsonText);

            // Todo: This probably isn't the best way of doing this
            //  - should probably have some method of denoting if a setting is importable, then it should run automatically

            newSettings.MergeItem((BindableSettings x) => x.RefreshInterval, _settings);

            // Note: This is a little hacky but I'm not sure how to trigger a refresh on the binding when replacing the entire list
            var servers = new Servers();

            newSettings.MergeItem(x => x.Servers, ref servers);

            if (servers.Any())
            {
                _settings.Servers.Clear();
                //_settings.CurrentServer = 0; Deprecated
                foreach (var server in servers)
                {
                    _settings.Servers.Add(server);
                }
            }
        }
예제 #2
0
        private IEnumerable <TestVariant> Build()
        {
            if (!Servers.Any())
            {
                throw new ArgumentException("No servers were specified.");
            }

            // TFMs.
            if (!Tfms.Any())
            {
                throw new ArgumentException("No TFMs were specified.");
            }

            ResolveDefaultArchitecture();

            if (!ApplicationTypes.Any())
            {
                ApplicationTypes.Add(ApplicationType.Portable);
            }

            if (!HostingModels.Any())
            {
                HostingModels.Add(HostingModel.OutOfProcess);
            }

            var variants = new List <TestVariant>();

            VaryByServer(variants);

            CheckForSkips(variants);

            return(variants);
        }
예제 #3
0
        public Server(string name, string fileName, bool autoReload, PSHost host, int port, bool https)
        {
            if (string.IsNullOrEmpty(name))
            {
                Name = $"Dashboard{_lastId}";
                _lastId++;
            }
            else
            {
                Name = name;
            }

            FileName = fileName;
            Port     = port;

            _reloadKey = Guid.NewGuid().ToString();

            if (_reloader == null)
            {
                _reloader = new AutoReloader(host);
            }

            if (autoReload)
            {
                _reloader.StartWatchingFile(fileName, Port, _reloadKey, https);
            }

            if (Servers.Any(m => m.Name.Equals(Name, StringComparison.OrdinalIgnoreCase)))
            {
                throw new Exception($"Server with name {Name} already exists.");
            }
        }
        void SetSelectedEnvironment()
        {
            if (_bindToActiveEnvironment)
            {
                if (_mainViewModel == null)
                {
                    return;
                }

                var server = Servers.FirstOrDefault(c => c.EnvironmentModel.IsLocalHost);
                if (server == null)
                {
                    return;
                }
                _selectedServerIndex = Servers.IndexOf(server);
                SelectedServer       = server;
                _connectControlSingleton.Refresh(server.EnvironmentModel.ID);
                _mainViewModel.SetActiveEnvironment(server.EnvironmentModel);
            }
            else
            {
                if (SelectedServer == null && Servers.Any())
                {
                    var selectedServerIndex = Servers.ToList().FindIndex(c => c.EnvironmentModel.IsLocalHost);
                    if (selectedServerIndex >= 0)
                    {
                        SelectedServerIndex = selectedServerIndex;
                    }
                }
            }
        }
예제 #5
0
        protected async Task <(RavenServer, Dictionary <RavenServer, ProxyServer>)> CreateRaftClusterWithProxiesAndGetLeader(int numberOfNodes, bool shouldRunInMemory = true, int?leaderIndex = null, bool useSsl = false, int delay = 0)
        {
            leaderIndex = leaderIndex ?? _random.Next(0, numberOfNodes);
            RavenServer leader           = null;
            var         serversToPorts   = new Dictionary <RavenServer, string>();
            var         serversToProxies = new Dictionary <RavenServer, ProxyServer>();

            for (var i = 0; i < numberOfNodes; i++)
            {
                string serverUrl;
                var    customSettings = GetServerSettingsForPort(useSsl, out serverUrl);

                int proxyPort = 10000;
                var co        = new ServerCreationOptions
                {
                    CustomSettings      = customSettings,
                    RunInMemory         = shouldRunInMemory,
                    RegisterForDisposal = false
                };
                var server = GetNewServer(co);
                var proxy  = new ProxyServer(ref proxyPort, Convert.ToInt32(server.ServerStore.GetNodeHttpServerUrl()), delay);
                serversToProxies.Add(server, proxy);

                if (Servers.Any(s => s.WebUrl.Equals(server.WebUrl, StringComparison.OrdinalIgnoreCase)) == false)
                {
                    Servers.Add(server);
                }

                serversToPorts.Add(server, serverUrl);
                if (i == leaderIndex)
                {
                    server.ServerStore.EnsureNotPassive();
                    leader = server;
                }
            }
            for (var i = 0; i < numberOfNodes; i++)
            {
                if (i == leaderIndex)
                {
                    continue;
                }
                var follower = Servers[i];
                // ReSharper disable once PossibleNullReferenceException
                await leader.ServerStore.AddNodeToClusterAsync(serversToPorts[follower]);

                await follower.ServerStore.WaitForTopology(Leader.TopologyModification.Voter);
            }
            // ReSharper disable once PossibleNullReferenceException
            var condition = await leader.ServerStore.WaitForState(RachisState.Leader, CancellationToken.None).WaitAsync(numberOfNodes * _electionTimeoutInMs * 5);

            var states = string.Empty;

            if (condition == false)
            {
                states = GetLastStatesFromAllServersOrderedByTime();
            }
            Assert.True(condition, "The leader has changed while waiting for cluster to become stable. All nodes status: " + states);
            return(leader, serversToProxies);
        }
예제 #6
0
 private void Regist(string aAddress, int aPort)
 {
     if (Servers.Any(p => p.Key == aAddress && p.Value == aPort))
     {
         return;
     }
     Servers.Add(new KeyValuePair <string, int>(aAddress, aPort));
     Host.Logger.WriteLine("Added server {0}:{1}.", aAddress, aPort);
 }
        public void AddGtaServers()
        {
            if (Servers.Any(server => server.ServerIp == "164.132.200.53" || server.ServerIp == "164.132.202.63" || server.ServerIp == "TS.grandtheftarma.com:9987"))
            {
                return;
            }

            Servers.Add(new ServersModel()
            {
                ContentButton       = "Join Server",
                IsJoinButtonEnabled = false,

                ServerInfo        = "Loading...",
                ServerInfoToolTip = @"Server Address: 164.132.200.53
Server Query Port: 2302",

                ServerIp        = "164.132.200.53",
                ServerQueryPort = "2302"
            });

            Servers.Add(new ServersModel()
            {
                ContentButton       = "Join Server",
                IsJoinButtonEnabled = false,

                ServerInfo        = "Loading...",
                ServerInfoToolTip = @"Server Address: 164.132.202.63
Server Query Port: 2302",

                ServerIp        = "164.132.202.63",
                ServerQueryPort = "2302"
            });

            Servers.Add(new ServersModel()
            {
                ContentButton       = "Join TeamSpeak",
                IsJoinButtonEnabled = false,
                JoinServerToolTip   = $@"Join: {_tsViewModel.TsChannelNameText}
Password: {_tsViewModel.TsChannelPasswordText}",

                ServerInfo        = "Loading...",
                ServerInfoToolTip = @"Server Address: TS.grandtheftarma.com:9987
TeamSpeak Selector: #ipsLayout_sidebar > div > ul > li:nth-child(2) > div > div:nth-child(3) > span
TeamSpeak Selector URL: http://grandtheftarma.com/",

                ServerIp      = "TS.grandtheftarma.com:9987",
                TsSelector    = "#ipsLayout_sidebar > div > ul > li:nth-child(2) > div > div:nth-child(3) > span",
                TsSelectorUrl = "http://grandtheftarma.com/"
            });
        }
예제 #8
0
 void Configure(IServer server)
 {
     server.OnStarted += (s, e) => {
         Logger.WriteLine("Server '" + ((Server.Server)s).Name + "' started");
         AnyRunning = true;
         EventHandlerExtensions.Invoke(OnServerStarted, this, new ServerStartedEventArgs((Server.Server)s));
     };
     server.OnStopped += (s, e) => {
         Logger.WriteLine("Server '" + ((Server.Server)s).Name + "' stopped");
         AnyRunning = Servers.Any(x => x.Running);
         EventHandlerExtensions.Invoke(OnServerStopped, this, new ServerStoppedEventArgs((Server.Server)s));
     };
     server.OnClientRequestingConnection += (s, e) => EventHandlerExtensions.Invoke(OnClientRequestingConnection, this, e);
 }
예제 #9
0
        public T RunCommand <T>(Func <PrincipalContext, T> command, int retries = 3)
        {
            if (Servers != null && Servers.Any())
            {
                foreach (var s in Servers) // try all servers in order, the first success will win
                {
                    try
                    {
                        using (var pc = UserAuth
                                            ? new PrincipalContext(ContextType.Domain, s, AuthUser, AuthPassword)
                                            : new PrincipalContext(ContextType.Domain, s))
                            return(command(pc));
                    }
                    catch (Exception ex)
                    {
                        Current.LogException("Couldn't contact AD server: " + s, ex);
                    }
                }
                Current.LogException(new SecurityException("Couldn't read any configured Active Directory servers."));
            }
            else
            {
                // try the current domain
                try
                {
                    using (var pc = new PrincipalContext(ContextType.Domain))
                        return(command(pc));
                }
                catch (Exception ex)
                {
                    if (retries > 0)
                    {
                        Thread.Sleep(1000);
                        RunCommand(command, retries - 1);
                    }
                    else
                    {
                        Current.LogException("Couldn't contact current AD", ex);
                    }
                }
            }

            return(default(T));
        }
예제 #10
0
        public async Task <bool> JoinServer(Invite invite)
        {
            try
            {
                if (Servers.Any(s => s.Id == invite.Server.Id))
                {
                    // Already joined the server
                    return(true);
                }

                await invite.Accept();

                return(true);
            }
            catch (Exception ex)
            {
                TShock.Log.ConsoleError(ex.Message);
                TShock.Log.Error(ex.ToString());
                return(false);
            }
        }
        private async void AddServer(object param)
        {
            if (param == null ||
                string.IsNullOrEmpty(param.ToString()))
            {
                return;
            }

            var serverName = param.ToString();

            if (Servers.Any(s => s.Name.Equals(serverName)))
            {
                ShowMessage(new Message {
                    MessageType = MessageType.Info, Text = $"A server with the name {serverName} already exists."
                });
                return;
            }

            try
            {
                IsLoading = true;

                var server = new Server {
                    Name = serverName
                };
                await serverService.SaveServer(server);

                Servers.Add(server);
            }
            catch (Exception ex)
            {
                ShowMessage(new Message {
                    MessageType = MessageType.Error, Text = ex.Message
                });
            }
            finally
            {
                IsLoading = false;
            }
        }
예제 #12
0
        public void Init(string notificationSettingsString)
        {
            var dict = ParseValue(notificationSettingsString);

            if (!dict.TryGetValue("groupid", out var _groupId))
            {
                throw new ArgumentException($"Не указан groupid для подключения к Kafka", "groupid");
            }
            GroupId = _groupId;

            dict.TryGetValue("clientid", out var _clientId);
            ClientId = _clientId;

            string server = string.Empty;

            if (dict.TryGetValue("servers", out server))
            {
                Servers = server.Split(',').Select(n => n.Trim());
            }
            else
            {
                throw new ArgumentException($"Не указан servers для подключения к Kafka", "servers");
            }

            if (!Servers.Any())
            {
                throw new ArgumentException($"Не удалось распарсить servers для подключения к Kafka (формат поля: 'servername1:port1, servername2:port2, servername3:port3.....')");
            }

            dict.TryGetValue("securityprotocol", out var _securityProtocol);
            SecurityProtocol = _securityProtocol;

            switch (SecurityProtocol?.ToUpper())
            {
            case "SASL_PLAINTEXT":
                SaslConfig = new SaslConfig();
                SaslConfig.Init(dict);
                break;
            }
        }
예제 #13
0
        public void ImportSettings(string filename)
        {
            var jsonText = File.ReadAllText(filename);
            var newSettings = PartialObject<BindableSettings>.Create(jsonText);

            // Todo: This probably isn't the best way of doing this
            //  - should probably have some method of denoting if a setting is importable, then it should run automatically

            newSettings.MergeItem((BindableSettings x) => x.RefreshInterval, _settings);

            // Note: This is a little hacky but I'm not sure how to trigger a refresh on the binding when replacing the entire list
            var servers = new Servers();
            newSettings.MergeItem(x => x.Servers, ref servers);

            if (servers.Any())
            {
                _settings.Servers.Clear();
                //_settings.CurrentServer = 0; Deprecated
                foreach (var server in servers)
                {
                    _settings.Servers.Add(server);
                }
            }
        }
        /// <summary>
        /// Loads the most updated configuration creating any resources as needed.
        /// </summary>
        /// <param name="bucketConfig">The latest <see cref="IBucketConfig"/>
        /// that will drive the recreation if the configuration context.</param>
        public override void LoadConfig(IBucketConfig bucketConfig, bool force = false)
        {
            try
            {
                Lock.EnterWriteLock();
                if (bucketConfig == null)
                {
                    throw new ArgumentNullException("bucketConfig");
                }
                if (BucketConfig == null || !BucketConfig.Nodes.AreEqual <Node>(bucketConfig.Nodes) || !Servers.Any() ||
                    force)
                {
                    Log.Info(m => m("o1-Creating the Servers {0} list using rev#{1}", Servers.Count(), bucketConfig.Rev));
                    var clientBucketConfig = ClientConfig.BucketConfigs[bucketConfig.Name];
                    var servers            = new List <IServer>();
                    var nodes = bucketConfig.GetNodes();
                    foreach (var adapter in nodes)
                    {
                        var endpoint = IPEndPointExtensions.GetEndPoint(adapter, clientBucketConfig, BucketConfig);
                        try
                        {
                            var poolConfiguration = ClientConfig.BucketConfigs[bucketConfig.Name].PoolConfiguration;
                            var connectionPool    = ConnectionPoolFactory(poolConfiguration, endpoint);
                            var ioStrategy        = IOStrategyFactory(connectionPool);
                            var saslMechanism     = SaslFactory(bucketConfig.Name, bucketConfig.Password, ioStrategy, Converter);
                            ioStrategy.SaslMechanism = saslMechanism;

                            var server = new Core.Server(ioStrategy, adapter, ClientConfig, bucketConfig);
                            servers.Add(server);
                        }
                        catch (Exception e)
                        {
                            Log.ErrorFormat("Could not add server {0}. Exception: {1}", endpoint, e);
                        }
                    }
                    var old = Interlocked.Exchange(ref Servers, servers);
                    if (old != null)
                    {
                        old.ForEach(x => x.Dispose());
                        old.Clear();
                    }
                }
                Log.Info(m => m("Creating the KeyMapper list using rev#{0}", bucketConfig.Rev));
                Interlocked.Exchange(ref _bucketConfig, bucketConfig);
                Interlocked.Exchange(ref KeyMapper, new VBucketKeyMapper(Servers, _bucketConfig.VBucketServerMap)
                {
                    Rev = _bucketConfig.Rev
                });
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
            finally
            {
                Lock.ExitWriteLock();
            }
        }
        /// <summary>
        /// Loads the most updated configuration creating any resources as needed.
        /// </summary>
        /// <param name="bucketConfig">The latest <see cref="IBucketConfig"/>
        /// that will drive the recreation if the configuration context.</param>
        /// <param name="force">True to force the reconfiguration.</param>
        public override void LoadConfig(IBucketConfig bucketConfig, bool force = false)
        {
            try
            {
                Lock.EnterWriteLock();
                var nodes = bucketConfig.GetNodes();
                if (BucketConfig == null || !nodes.AreEqual(BucketConfig.GetNodes()) || !Servers.Any() || force)
                {
                    Log.Info("o1-Creating the Servers {0} list using rev#{1}", nodes.Count, bucketConfig.Rev);

                    var searchUris         = new ConcurrentBag <FailureCountingUri>();
                    var queryUris          = new ConcurrentBag <FailureCountingUri>();
                    var analyticsUris      = new ConcurrentBag <FailureCountingUri>();
                    var clientBucketConfig = ClientConfig.BucketConfigs[bucketConfig.Name];
                    var servers            = new Dictionary <IPEndPoint, IServer>();
                    foreach (var adapter in nodes)
                    {
                        var endpoint = adapter.GetIPEndPoint(clientBucketConfig.UseSsl);
                        try
                        {
                            //The node does not have to be created or swapped out so reuse the existing mode
                            if (Servers.TryGetValue(endpoint, out IServer cachedServer))
                            {
                                Log.Info("Reusing node {0} for rev#{1}", endpoint, bucketConfig.Rev);
                                servers.Add(endpoint, cachedServer);
                            }
                            else
                            {
                                Log.Info("Creating node {0} for rev#{1}", endpoint, bucketConfig.Rev);

                                IServer server;
                                if (adapter.IsDataNode) //a data node so create a connection pool
                                {
                                    var uri = UrlUtil.GetBaseUri(adapter, clientBucketConfig);
                                    var poolConfiguration = ClientConfig.BucketConfigs[BucketConfig.Name]
                                                            .ClonePoolConfiguration(uri);

                                    var ioService = CreateIOService(poolConfiguration, endpoint);

                                    server = new Core.Server(ioService, adapter, Transcoder, QueryCache, this);

                                    SupportsEnhancedDurability     = ioService.SupportsEnhancedDurability;
                                    SupportsSubdocXAttributes      = ioService.SupportsSubdocXAttributes;
                                    SupportsEnhancedAuthentication = ioService.SupportsEnhancedAuthentication;
                                    SupportsKvErrorMap             = ioService.SupportsKvErrorMap;
                                }
                                else
                                {
                                    server = new Core.Server(null, adapter, Transcoder, QueryCache, this);
                                }

                                servers.Add(endpoint, server);
                            }

                            if (adapter.IsSearchNode)
                            {
                                var uri = UrlUtil.GetFailureCountinSearchBaseUri(adapter, clientBucketConfig);
                                searchUris.Add(uri);
                            }
                            if (adapter.IsQueryNode)
                            {
                                var uri = UrlUtil.GetFailureCountingBaseUri(adapter, clientBucketConfig);
                                queryUris.Add(uri);
                            }
                            if (adapter.IsAnalyticsNode)
                            {
                                var uri = UrlUtil.GetFailureCountingAnalyticsUri(adapter, clientBucketConfig);
                                analyticsUris.Add(uri);
                            }
                        }
                        catch (Exception e)
                        {
                            Log.Error("Could not add server {0} for rev#{1}. Exception: {2}", endpoint, bucketConfig.Rev, e);
                        }
                    }

                    UpdateServices(servers);

                    //for caching uri's
                    Interlocked.Exchange(ref QueryUris, queryUris);
                    Interlocked.Exchange(ref SearchUris, searchUris);
                    Interlocked.Exchange(ref AnalyticsUris, analyticsUris);

                    SwapServers(servers);

                    Log.Info("Creating the KeyMapper list using rev#{0}", bucketConfig.Rev);
                    var vBucketKeyMapper = new VBucketKeyMapper(Servers,
                                                                bucketConfig.GetBucketServerMap(clientBucketConfig.UseSsl),
                                                                bucketConfig.Rev,
                                                                bucketConfig.Name);

                    Interlocked.Exchange(ref KeyMapper, vBucketKeyMapper);
                    Interlocked.Exchange(ref _bucketConfig, bucketConfig);
                }
                else
                {
                    if (BucketConfig == null || !BucketConfig.IsVBucketServerMapEqual(bucketConfig) || force)
                    {
                        Log.Info("Creating the KeyMapper list using rev#{0}", bucketConfig.Rev);
                        var vBucketKeyMapper = new VBucketKeyMapper(Servers,
                                                                    bucketConfig.GetBucketServerMap(ClientConfig.BucketConfigs[bucketConfig.Name].UseSsl),
                                                                    bucketConfig.Rev,
                                                                    bucketConfig.Name);

                        Interlocked.Exchange(ref KeyMapper, vBucketKeyMapper);
                        Interlocked.Exchange(ref _bucketConfig, bucketConfig);
                    }
                    //only the revision changed so update to it
                    if (bucketConfig.Rev > BucketConfig.Rev)
                    {
                        Log.Info("Only the revision changed from using rev#{0} to rev#{1}", BucketConfig.Rev, bucketConfig.Rev);
                        BucketConfig.Rev = bucketConfig.Rev;
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
            finally
            {
                Lock.ExitWriteLock();
            }
        }
        /// <summary>
        /// Loads the most updated configuration creating any resources as needed.
        /// </summary>
        /// <param name="bucketConfig">The latest <see cref="IBucketConfig"/>
        /// that will drive the recreation if the configuration context.</param>
        /// <param name="force">True to force the reconfiguration.</param>
        public override void LoadConfig(IBucketConfig bucketConfig, bool force = false)
        {
            try
            {
                Lock.EnterWriteLock();
                var nodes = bucketConfig.GetNodes();
                if (BucketConfig == null || !nodes.AreEqual(_bucketConfig.GetNodes()) || !Servers.Any() || force)
                {
                    Log.InfoFormat("o1-Creating the Servers {0} list using rev#{1}", nodes.Count, bucketConfig.Rev);

                    var queryUris          = new ConcurrentBag <FailureCountingUri>();
                    var clientBucketConfig = ClientConfig.BucketConfigs[bucketConfig.Name];
                    var servers            = new Dictionary <IPAddress, IServer>();
                    foreach (var adapter in nodes)
                    {
                        var endpoint = adapter.GetIPEndPoint(clientBucketConfig.UseSsl);
                        try
                        {
                            Log.InfoFormat("Creating node {0} for rev#{1}", endpoint, bucketConfig.Rev);
                            IServer server;
                            if (adapter.IsQueryNode)
                            {
                                var uri = UrlUtil.GetFailureCountingBaseUri(adapter, clientBucketConfig);
                                uri.ConfigureServicePoint(ClientConfig);
                                queryUris.Add(uri);
                            }
                            if (adapter.IsDataNode) //a data node so create a connection pool
                            {
                                var poolConfiguration = ClientConfig.BucketConfigs[bucketConfig.Name].PoolConfiguration;
                                var connectionPool    = ConnectionPoolFactory(poolConfiguration, endpoint);
                                var ioStrategy        = IOStrategyFactory(connectionPool);

                                server = new Core.Server(ioStrategy, adapter, ClientConfig, bucketConfig, Transcoder, QueryCache)
                                {
                                    SaslFactory = SaslFactory
                                };
                                server.CreateSaslMechanismIfNotExists();
                                SupportsEnhancedDurability = ioStrategy.SupportsEnhancedDurability;
                            }
                            else
                            {
                                server = new Core.Server(null, adapter, ClientConfig, bucketConfig, Transcoder, QueryCache);
                            }
                            servers.Add(endpoint.Address, server);
                        }
                        catch (Exception e)
                        {
                            Log.ErrorFormat("Could not add server {0} for rev#{1}. Exception: {2}", endpoint, bucketConfig.Rev, e);
                        }
                    }

                    UpdateServices(servers);

                    //for caching uri's
                    Interlocked.Exchange(ref QueryUris, queryUris);

                    var old = Interlocked.Exchange(ref Servers, servers);
                    Log.Info(m => m("Creating the KeyMapper list using rev#{0}", bucketConfig.Rev));
                    var vBucketKeyMapper = new VBucketKeyMapper(Servers, bucketConfig.VBucketServerMap, bucketConfig.Rev);
                    Interlocked.Exchange(ref KeyMapper, vBucketKeyMapper);
                    Interlocked.Exchange(ref _bucketConfig, bucketConfig);

                    if (old != null)
                    {
                        foreach (var server in old.Values)
                        {
                            Log.InfoFormat("Disposing node {0} from rev#{1}", server.EndPoint, server.Revision);
                            server.Dispose();
                        }
                        old.Clear();
                    }
                }
                else
                {
                    if (BucketConfig == null || !BucketConfig.IsVBucketServerMapEqual(bucketConfig) || force)
                    {
                        Log.Info(m => m("Creating the KeyMapper list using rev#{0}", bucketConfig.Rev));
                        var vBucketKeyMapper = new VBucketKeyMapper(Servers, bucketConfig.VBucketServerMap,
                                                                    bucketConfig.Rev);
                        Interlocked.Exchange(ref KeyMapper, vBucketKeyMapper);
                        Interlocked.Exchange(ref _bucketConfig, bucketConfig);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
            finally
            {
                Lock.ExitWriteLock();
            }
        }
예제 #17
0
        /// <summary>
        /// Loads the most updated configuration creating any resources as needed.
        /// </summary>
        /// <param name="bucketConfig">The latest <see cref="IBucketConfig"/>
        /// that will drive the recreation if the configuration context.</param>
        /// <param name="force">True to force the reconfiguration.</param>
        public override void LoadConfig(IBucketConfig bucketConfig, bool force = false)
        {
            try
            {
                Lock.EnterWriteLock();
                var nodes = bucketConfig.GetNodes();
                if (BucketConfig == null || !nodes.AreEqual(_bucketConfig.GetNodes()) || !Servers.Any() || force)
                {
                    Log.Info("o1-Creating the Servers {0} list using rev#{1}", nodes.Count, bucketConfig.Rev);

                    var searchUris         = new ConcurrentBag <FailureCountingUri>();
                    var queryUris          = new ConcurrentBag <FailureCountingUri>();
                    var analyticsUris      = new ConcurrentBag <FailureCountingUri>();
                    var clientBucketConfig = ClientConfig.BucketConfigs[bucketConfig.Name];
                    var servers            = new Dictionary <IPAddress, IServer>();
                    foreach (var adapter in nodes)
                    {
                        var endpoint = adapter.GetIPEndPoint(clientBucketConfig.UseSsl);
                        try
                        {
                            Log.Info("Creating node {0} for rev#{1}", endpoint, bucketConfig.Rev);
                            IServer server;
                            if (adapter.IsSearchNode)
                            {
                                var uri = UrlUtil.GetFailureCountinSearchBaseUri(adapter, clientBucketConfig);
                                searchUris.Add(uri);
                            }
                            if (adapter.IsQueryNode)
                            {
                                var uri = UrlUtil.GetFailureCountingBaseUri(adapter, clientBucketConfig);
                                queryUris.Add(uri);
                            }
                            if (adapter.IsAnalyticsNode)
                            {
                                var uri = UrlUtil.GetFailureCountingAnalyticsUri(adapter, clientBucketConfig);
                                analyticsUris.Add(uri);
                            }
                            if (adapter.IsDataNode) //a data node so create a connection pool
                            {
                                var uri = UrlUtil.GetBaseUri(adapter, clientBucketConfig);
                                var poolConfiguration = ClientConfig.BucketConfigs[BucketConfig.Name].ClonePoolConfiguration(uri);
                                var connectionPool    = ConnectionPoolFactory(poolConfiguration.Clone(uri), endpoint);
                                connectionPool.SaslMechanism = SaslFactory(BucketConfig.Name, BucketConfig.Password, connectionPool, Transcoder);
                                connectionPool.Initialize();

                                var ioService = IOServiceFactory(connectionPool);
                                server = new Core.Server(ioService, adapter, ClientConfig, bucketConfig, Transcoder, QueryCache);

                                SupportsEnhancedDurability     = ioService.SupportsEnhancedDurability;
                                SupportsSubdocXAttributes      = ioService.SupportsSubdocXAttributes;
                                SupportsEnhancedAuthentication = ioService.SupportsEnhancedAuthentication;
                                SupportsKvErrorMap             = ioService.SupportsKvErrorMap;
                            }
                            else
                            {
                                server = new Core.Server(null, adapter, ClientConfig, bucketConfig, Transcoder, QueryCache);
                            }
                            servers.Add(endpoint.Address, server);
                        }
                        catch (Exception e)
                        {
                            Log.Error("Could not add server {0} for rev#{1}. Exception: {2}", endpoint, bucketConfig.Rev, e);
                        }
                    }

                    UpdateServices(servers);

                    //for caching uri's
                    Interlocked.Exchange(ref QueryUris, queryUris);
                    Interlocked.Exchange(ref SearchUris, searchUris);
                    Interlocked.Exchange(ref AnalyticsUris, analyticsUris);

                    var old = Interlocked.Exchange(ref Servers, servers);
                    Log.Info("Creating the KeyMapper list using rev#{0}", bucketConfig.Rev);
                    var vBucketKeyMapper = new VBucketKeyMapper(Servers, bucketConfig.VBucketServerMap, bucketConfig.Rev, bucketConfig.Name);
                    Interlocked.Exchange(ref KeyMapper, vBucketKeyMapper);
                    Interlocked.Exchange(ref _bucketConfig, bucketConfig);

                    if (old != null)
                    {
                        foreach (var server in old.Values)
                        {
                            Log.Info("Disposing node {0} from rev#{1}", server.EndPoint, server.Revision);
                            server.Dispose();
                        }
                        old.Clear();
                    }
                }
                else
                {
                    if (BucketConfig == null || !BucketConfig.IsVBucketServerMapEqual(bucketConfig) || force)
                    {
                        Log.Info("Creating the KeyMapper list using rev#{0}", bucketConfig.Rev);
                        var vBucketKeyMapper = new VBucketKeyMapper(Servers, bucketConfig.VBucketServerMap,
                                                                    bucketConfig.Rev, bucketConfig.Name);
                        Interlocked.Exchange(ref KeyMapper, vBucketKeyMapper);
                        Interlocked.Exchange(ref _bucketConfig, bucketConfig);
                    }
                    //only the revision changed so update to it
                    if (bucketConfig.Rev > BucketConfig.Rev)
                    {
                        Log.Info("Only the revision changed from using rev#{0} to rev#{1}", BucketConfig.Rev, bucketConfig.Rev);
                        BucketConfig.Rev = bucketConfig.Rev;
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
            finally
            {
                Lock.ExitWriteLock();
            }
        }
예제 #18
0
        /// <summary>
        /// Starts scanning for Maple servers
        /// </summary>
        public async Task StartScanningForAdvertisingServers()
        {
            //var hostList = new List<ServerModel>();
            var listener   = new UdpClient(ListenPort);
            var ipEndPoint = new IPEndPoint(IPAddress.Any, ListenPort);

            string[] delimeter = new string[] { "::" };

            var timeoutTask = UdpTimeoutTask();

            try
            {
                while (timeoutTask.IsCompleted == false)
                {
                    //Console.WriteLine("Waiting for broadcast");

                    // create two tasks, one that will timeout after a while
                    var tasks = new Task <UdpReceiveResult>[] {
                        timeoutTask,
                        listener.ReceiveAsync()
                    };

                    int index = 0;

                    await Task.Run(() => index = Task.WaitAny(tasks));

                    var results = tasks[index].Result;

                    if (results.RemoteEndPoint == null)
                    {
                        break;
                    }

                    string host   = Encoding.UTF8.GetString(results.Buffer, 0, results.Buffer.Length);
                    string hostIp = host.Split(delimeter, StringSplitOptions.None)[1];

                    //Console.WriteLine($"Raw:{host}, ip:{hostIp}");

                    //Console.WriteLine("Received broadcast from {0} :\n {1}\n", hostIp, host);

                    var server = new ServerModel()
                    {
                        Name      = host.Split(delimeter, StringSplitOptions.None)[0],
                        IpAddress = host.Split(delimeter, StringSplitOptions.None)[1]
                    };

                    // if the server doesn't already exist in the list
                    if (!Servers.Any(s => s.IpAddress == hostIp))
                    {   // add it
                        //Console.WriteLine($"Found a server. Name: '{server.Name}', IP: {server.IpAddress} ");
                        Servers.Add(server);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                listener.Dispose();
            }
        }
예제 #19
0
        public static void Main()
        {
            AppDomain.CurrentDomain.ProcessExit += OnExit;

            Headless = GetFlagFromArgs("headless", "h");

            string serverIdArg = GetParamFromArgs("server-id", "id");
            string configArg   = GetParamFromArgs("config", "c");

            portArg = uint.TryParse(GetParamFromArgs("port", "p"), out uint port) ? (uint?)port : null;

            Server server = null;

            if (!string.IsNullOrEmpty(serverIdArg) || !string.IsNullOrEmpty(configArg))
            {
                server = new Server(serverIdArg, configArg, portArg);

                InstantiatedServers.Add(server);
            }
            else
            {
                if (Servers.Any())
                {
                    Server[] autoStartServers = AutoStartServers;

                    if (autoStartServers.Any())
                    {
                        Write("Starting this instance in multi server mode...");

                        for (int i = 0; i < autoStartServers.Length; i++)
                        {
                            if (i == 0)
                            {
                                server = autoStartServers[i];

                                InstantiatedServers.Add(server);
                            }
                            else
                            {
                                StartServer(autoStartServers[i]);
                            }
                        }
                    }
                    else
                    {
                        Write("No servers are set to automatically start, please enter a Server ID to start:");
                        InputThread.InputPrefix?.Write();

                        server = new Server(Console.ReadLine(), port: portArg);

                        InstantiatedServers.Add(server);
                    }
                }
                else
                {
                    server = new Server(port: portArg);

                    InstantiatedServers.Add(server);
                }
            }

            if (server != null)
            {
                if (!string.IsNullOrEmpty(server.serverId) && !string.IsNullOrEmpty(server.configLocation))
                {
                    Write($"Starting this instance with Server ID: \"{server.serverId}\" and config directory: \"{server.configLocation}\"...");
                }

                else if (!string.IsNullOrEmpty(server.serverId))
                {
                    Write($"Starting this instance with Server ID: \"{server.serverId}\"...");
                }

                else if (!string.IsNullOrEmpty(server.configLocation))
                {
                    Write($"Starting this instance with config directory: \"{server.configLocation}\"...");
                }

                else
                {
                    Write("Starting this instance in single server mode...");
                }

                server.StartServer();
            }
        }
        /// <summary>
        /// Loads the most updated configuration creating any resources as needed.
        /// </summary>
        /// <param name="bucketConfig">The latest <see cref="IBucketConfig"/>
        /// that will drive the recreation if the configuration context.</param>
        /// <param name="force">True to force the reconfiguration.</param>
        public override void LoadConfig(IBucketConfig bucketConfig, bool force = false)
        {
            try
            {
                Lock.EnterWriteLock();
                var nodes = bucketConfig.GetNodes();
                if (BucketConfig == null || !nodes.AreEqual(_bucketConfig.GetNodes()) || !Servers.Any() || force)
                {
                    var clientBucketConfig = ClientConfig.BucketConfigs[bucketConfig.Name];
                    var servers            = new Dictionary <IPAddress, IServer>();
                    foreach (var adapter in nodes)
                    {
                        var endpoint = adapter.GetIPEndPoint(clientBucketConfig.UseSsl);
                        try
                        {
                            Log.Info(
                                m =>
                                m("o1-Creating the Servers {0} list using rev#{1}", Servers.Count(),
                                  bucketConfig.Rev));
                            var poolConfiguration = ClientConfig.BucketConfigs[bucketConfig.Name].PoolConfiguration;

                            var connectionPool = ConnectionPoolFactory(poolConfiguration, endpoint);
                            var ioStrategy     = IOStrategyFactory(connectionPool);

                            var server = new Core.Server(ioStrategy, adapter, ClientConfig, bucketConfig, Transcoder, QueryCache)
                            {
                                SaslFactory = SaslFactory
                            };
                            server.CreateSaslMechanismIfNotExists();
                            SupportsEnhancedDurability = ioStrategy.SupportsEnhancedDurability;

                            servers.Add(endpoint.Address, server);
                        }
                        catch (Exception e)
                        {
                            Log.ErrorFormat("Could not add server {0}. Exception: {1}", endpoint, e);
                        }
                    }

                    UpdateServices(servers);

                    var old = Interlocked.Exchange(ref Servers, servers);
                    Log.Info(m => m("Creating the KeyMapper list using rev#{0}", bucketConfig.Rev));
                    var vBucketKeyMapper = new VBucketKeyMapper(Servers, bucketConfig.VBucketServerMap, bucketConfig.Rev);
                    Interlocked.Exchange(ref KeyMapper, vBucketKeyMapper);
                    Interlocked.Exchange(ref _bucketConfig, bucketConfig);

                    if (old != null)
                    {
                        foreach (var server in old.Values)
                        {
                            server.Dispose();
                        }
                        old.Clear();
                    }
                }
                else
                {
                    if (BucketConfig == null || !BucketConfig.IsVBucketServerMapEqual(bucketConfig) || force)
                    {
                        Log.Info(m => m("Creating the KeyMapper list using rev#{0}", bucketConfig.Rev));
                        var vBucketKeyMapper = new VBucketKeyMapper(Servers, bucketConfig.VBucketServerMap,
                                                                    bucketConfig.Rev);
                        Interlocked.Exchange(ref KeyMapper, vBucketKeyMapper);
                        Interlocked.Exchange(ref _bucketConfig, bucketConfig);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
            finally
            {
                Lock.ExitWriteLock();
            }
        }