protected void AddRegisteredBlockServer(long serverGuid, IServiceAddress address) { lock (blockServersMap) { BlockServerInfo blockServer = new BlockServerInfo(serverGuid, address, ServiceStatus.Up); // Add to the internal map/list blockServersMap[serverGuid] = blockServer; blockServers.Add(blockServer); } UpdateAddressSpaceEnd(); }
private void PollServer(BlockServerInfo server) { bool pollOk = true; // Send the poll command to the service, IMessageProcessor p = connector.Connect(server.Address, ServiceType.Block); RequestMessage request = new RequestMessage("poll"); request.Arguments.Add("manager heartbeat"); Message response = p.Process(request); // Any error with the poll means no status change, if (response.HasError) { pollOk = false; } // If the poll is ok, set the status of the service to UP and remove from // the monitor list, if (pollOk) { // The service status is set to 'Up' if either the current state // is 'DownClientReport' or 'DownHeartbeat' // Lock over servers map for safe alteration of the ref. lock (blockServersMap) { if (server.Status == ServiceStatus.DownClientReport || server.Status == ServiceStatus.DownHeartbeat) { server.Status = ServiceStatus.Up; } } // Remove the service from the monitored_servers list. lock (heartbeatLock) { monitoredServers.Remove(server); } } else { // Make sure the service status is set to 'DownHeartbeat' if the poll // failed, // Lock over servers map for safe alteration of the ref. lock (blockServersMap) { if (server.Status == ServiceStatus.Up || server.Status == ServiceStatus.DownClientReport) { server.Status = ServiceStatus.DownHeartbeat; } } } }
private void RegisterBlockServer(IServiceAddress serviceAddress) { // Open a connection with the block service, IMessageProcessor processor = connector.Connect(serviceAddress, ServiceType.Block); // Lock the block service with this manager RequestMessage request = new RequestMessage("bindWithManager"); request.Arguments.Add(address); Message response = processor.Process(request); if (response.HasError) throw new ApplicationException(response.ErrorMessage); // Get the block set report from the service, request = new RequestMessage("blockSetReport"); response = processor.Process(request); if (response.HasError) throw new ApplicationException(response.ErrorMessage); long serverGuid = response.Arguments[0].ToInt64(); long[] blockIdList = (long[])response.Arguments[1].Value; // Create a transaction lock (blockDbWriteLock) { ITransaction transaction = blockDatabase.CreateTransaction(); try { // Get the map, BlockServerTable blockServerTable = new BlockServerTable(transaction.GetFile(BlockServerKey, FileAccess.ReadWrite)); int actualAdded = 0; // Read until the end int sz = blockIdList.Length; // Put each block item into the database, for (int i = 0; i < sz; ++i) { long block_id = blockIdList[i]; bool added = blockServerTable.Add(block_id, serverGuid); if (added) { // TODO: Check if a service is adding polluted blocks into the // network via checksum, ++actualAdded; } } if (actualAdded > 0) { // Commit and check point the update, blockDatabase.Publish(transaction); blockDatabase.CheckPoint(); } } finally { blockDatabase.Dispose(transaction); } } BlockServerInfo blockServer = new BlockServerInfo(serverGuid, serviceAddress, ServiceStatus.Up); // Add it to the map lock (blockServersMap) { blockServersMap[serverGuid] = blockServer; blockServers.Add(blockServer); PersistBlockServers(blockServers); } // Update the address space end variable, UpdateAddressSpaceEnd(); }
private void MonitorServer(BlockServerInfo blockServer) { lock (heartbeatLock) { if (!monitoredServers.Contains(blockServer)) monitoredServers.Add(blockServer); } }