Example #1
0
        private int GetNextServerIndex(ServerInstance[] serverInstances)
        {
            lock (syncRoot)
            {
                // Find server with the earliest time stamp
                DateTime min = DateTime.MaxValue;
                int      m   = -1;

                for (int i = 0; i < serverInstances.Length; i++)
                {
                    ServerInstance si = serverInstances[i];

                    if (si.LastAssigned < min)
                    {
                        min = si.LastAssigned;
                        m   = i;
                    }
                }

                if (m == -1)
                {
                    throw new SchedulerException(ExceptionMessages.NoServerForDatabaseFound);
                }

                serverInstances[m].LastAssigned = DateTime.Now;

                return(m);
            }
        }
Example #2
0
        /// <summary>
        /// Returns the server instances that all contain an instance
        /// the database definition
        /// </summary>
        /// <param name="databaseDefinitions"></param>
        /// <param name="databaseVersionName"></param>
        /// <returns></returns>
        private ServerInstance[] GetServerInstancesInternal(Guid[] databaseDefinitions, string databaseVersionName, Guid[] databaseInstances)
        {
            // TODO: lock?
            // TODO: for some reason it might return wrong results when database version is non-existing, check this

            // Start with all server instances
            var sis = new HashSet <Guid>(queueManager.Cluster.ServerInstances.Keys);

            // If there's any database instances specified then a specific server instance will be required
            if (databaseInstances != null && databaseInstances.Length > 0)
            {
                var disis = new HashSet <Guid>();
                foreach (var di in databaseInstances)
                {
                    var si = queueManager.Cluster.DatabaseInstances[di].ServerInstance;
                    if (si.IsAvailable)
                    {
                        disis.Add(si.Guid);
                    }
                }

                sis.IntersectWith(disis);
            }

            foreach (var dd in databaseDefinitions)
            {
                if (queueManager.Cluster.DatabaseDefinitions[dd].DatabaseInstances.ContainsKey(databaseVersionName))
                {
                    var disis = new HashSet <Guid>();

                    foreach (var di in queueManager.Cluster.DatabaseDefinitions[dd].DatabaseInstances[databaseVersionName].Values)
                    {
                        var si = di.ServerInstance;

                        if (si.IsAvailable)
                        {
                            disis.Add(si.Guid);
                        }
                    }

                    sis.IntersectWith(disis);
                }
            }


            var res = new ServerInstance[sis.Count];

            int q = 0;

            foreach (var si in sis)
            {
                res[q] = queueManager.Cluster.ServerInstances[si];
                q++;
            }

            return(res);
        }
Example #3
0
        public Guid GetNextDatabaseInstance(Guid databaseDefinition, string databaseVersion)
        {
            var q =
                from di in queueManager.Cluster.DatabaseDefinitions[databaseDefinition].DatabaseInstances[databaseVersion].Values
                where di.ServerInstance.IsAvailable
                select di;

            var dis = q.ToArray();

            var sis = new ServerInstance[dis.Length];

            for (int i = 0; i < sis.Length; i++)
            {
                sis[i] = dis[i].ServerInstance;
            }

            return(sis[GetNextServerIndex(sis)].Guid);
        }
Example #4
0
        public void Load(string clusterName)
        {
            using (Context context = ContextManager.Instance.CreateContext(ConnectionMode.AutoOpen, TransactionMode.AutoCommit))
            {
                var ef      = new EntityFactory(context);
                var cluster = ef.LoadEntity <Jhu.Graywulf.Registry.Cluster>(clusterName);

                machines            = new Dictionary <Guid, Machine>();
                serverInstances     = new Dictionary <Guid, ServerInstance>();
                databaseInstances   = new Dictionary <Guid, DatabaseInstance>();
                databaseDefinitions = new Dictionary <Guid, DatabaseDefinition>();
                queues = new Dictionary <Guid, Queue>();

                cluster.LoadMachineRoles(true);

                // *** TODO: handle machines that are down
                foreach (var mr in cluster.MachineRoles.Values)
                {
                    mr.LoadMachines(true);

                    foreach (var mm in mr.Machines.Values)
                    {
                        var mmi = new Machine(mm);
                        machines.Add(mm.Guid, mmi);

                        mm.LoadServerInstances(true);

                        foreach (var si in mm.ServerInstances.Values)
                        {
                            var ssi = new ServerInstance(si);
                            ssi.Machine = mmi;

                            serverInstances.Add(si.Guid, ssi);
                        }

                        mm.LoadQueueInstances(true);

                        foreach (var qi in mm.QueueInstances.Values)
                        {
                            var q = new Queue();
                            q.Update(qi);
                            queues.Add(qi.Guid, q);
                        }
                    }
                }

                cluster.LoadDomains(true);
                foreach (var dom in cluster.Domains.Values)
                {
                    dom.LoadFederations(true);
                    foreach (var ff in dom.Federations.Values)
                    {
                        ff.LoadDatabaseDefinitions(true);
                        foreach (var dd in ff.DatabaseDefinitions.Values)
                        {
                            databaseDefinitions.Add(dd.Guid, new DatabaseDefinition(dd));

                            dd.LoadDatabaseInstances(true);
                            foreach (var di in dd.DatabaseInstances.Values)
                            {
                                var ddi = new DatabaseInstance(di);

                                // add to global list
                                databaseInstances.Add(di.Guid, ddi);

                                // add to database definition lists
                                Dictionary <Guid, DatabaseInstance> databaseinstances;
                                if (databaseDefinitions[dd.Guid].DatabaseInstances.ContainsKey((di.DatabaseVersion.Name)))
                                {
                                    databaseinstances = databaseDefinitions[dd.Guid].DatabaseInstances[di.DatabaseVersion.Name];
                                }
                                else
                                {
                                    databaseinstances = new Dictionary <Guid, DatabaseInstance>();
                                    databaseDefinitions[dd.Guid].DatabaseInstances.Add(di.DatabaseVersion.Name, databaseinstances);
                                }

                                databaseinstances.Add(di.Guid, ddi);

                                ddi.ServerInstance     = serverInstances[di.ServerInstanceReference.Guid];
                                ddi.DatabaseDefinition = databaseDefinitions[dd.Guid];
                            }
                        }
                    }
                }
            }
        }
 private void InitializeMembers()
 {
     this.serverInstance     = null;
     this.databaseDefinition = null;
 }