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); } }
/// <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); }
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); }
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; }