Exemple #1
0
        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();
        }
Exemple #2
0
        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;
                    }
                }
            }
        }
Exemple #3
0
        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();
        }
Exemple #4
0
 private void MonitorServer(BlockServerInfo blockServer)
 {
     lock (heartbeatLock) {
         if (!monitoredServers.Contains(blockServer))
             monitoredServers.Add(blockServer);
     }
 }