Exemplo n.º 1
0
        /// <summary>
        /// Finds and deletes neighbor actions for which there is no existing neighbor.
        /// </summary>
        /// <returns>true if the function succeeds, false otherwise.</returns>
        private bool DeleteInvalidNeighborActions()
        {
            log.Info("()");

            bool res = false;

            using (UnitOfWork unitOfWork = new UnitOfWork())
            {
                // Disable change tracking for faster multiple deletes.
                unitOfWork.Context.ChangeTracker.AutoDetectChangesEnabled = false;

                DatabaseLock[] lockObjects = new DatabaseLock[] { UnitOfWork.NeighborActivityLock, UnitOfWork.NeighborLock };
                unitOfWork.AcquireLock(lockObjects);
                try
                {
                    List <byte[]>           neighborIds        = unitOfWork.NeighborRepository.Get(null, null, true).Select(n => n.NeighborId).ToList();
                    HashSet <byte[]>        neighborIdsHashSet = new HashSet <byte[]>(neighborIds, StructuralEqualityComparer <byte[]> .Default);
                    List <NeighborActivity> identities         = unitOfWork.NeighborActivityRepository.Get(null, null, true).ToList();

                    bool saveDb        = false;
                    int  deleteCounter = 0;
                    foreach (NeighborActivity identity in identities)
                    {
                        if (!neighborIdsHashSet.Contains(identity.PrimaryServerId))
                        {
                            unitOfWork.NeighborActivityRepository.Delete(identity);
                            saveDb = true;
                            deleteCounter++;
                        }
                    }

                    if (saveDb)
                    {
                        log.Debug("Removing {0} identities without existing neighbor server.", deleteCounter);

                        unitOfWork.SaveThrow();
                    }
                    else
                    {
                        log.Debug("No identities without existing neighbor server found.");
                    }
                    res = true;
                }
                catch (Exception e)
                {
                    log.Error("Exception occurred: {0}", e.ToString());
                }

                unitOfWork.ReleaseLock(lockObjects);
            }

            log.Info("(-):{0}", res);
            return(res);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Removes neighbor servers from database that we failed to finish the neighborhood initialization process with.
        /// </summary>
        /// <returns>true if the function succeeds, false otherwise.</returns>
        private bool DeleteUninitializedNeighbors()
        {
            log.Info("()");

            bool res = false;

            using (UnitOfWork unitOfWork = new UnitOfWork())
            {
                List <Neighbor> neighborsToDelete = null;

                DatabaseLock lockObject = UnitOfWork.NeighborLock;
                unitOfWork.AcquireLock(lockObject);
                try
                {
                    neighborsToDelete = unitOfWork.NeighborRepository.Get(n => n.LastRefreshTime == null).ToList();
                }
                catch (Exception e)
                {
                    log.Error("Exception occurred: {0}", e.ToString());
                }
                unitOfWork.ReleaseLock(lockObject);

                // Delete neighbor completely.
                if (neighborsToDelete.Count > 0)
                {
                    bool error = false;
                    log.Debug("Removing {0} uninitialized neighbors.", neighborsToDelete.Count);
                    foreach (Neighbor neighbor in neighborsToDelete)
                    {
                        Task <bool> task = unitOfWork.NeighborRepository.DeleteNeighbor(unitOfWork, neighbor.NeighborId);
                        if (!task.Result)
                        {
                            log.Error("Unable to delete neighbor ID '{0}' from the database.", neighbor.NeighborId.ToHex());
                            error = true;
                            break;
                        }
                    }

                    res = !error;
                }
                else
                {
                    res = true;
                    log.Debug("No uninitialized neighbors found.");
                }
            }

            log.Info("(-):{0}", res);
            return(res);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Removes follower servers from database that failed to finish the neighborhood initialization process.
        /// </summary>
        /// <returns>true if the function succeeds, false otherwise.</returns>
        private bool DeleteUninitializedFollowers()
        {
            log.Info("()");

            bool res = false;

            using (UnitOfWork unitOfWork = new UnitOfWork())
            {
                DatabaseLock lockObject = UnitOfWork.FollowerLock;
                unitOfWork.AcquireLock(lockObject);
                try
                {
                    List <Follower> followers = unitOfWork.FollowerRepository.Get(f => f.LastRefreshTime == null).ToList();
                    if (followers.Count > 0)
                    {
                        log.Debug("Removing {0} uninitialized followers.", followers.Count);
                        foreach (Follower follower in followers)
                        {
                            unitOfWork.FollowerRepository.Delete(follower);
                        }

                        res = unitOfWork.Save();
                    }
                    else
                    {
                        res = true;
                        log.Debug("No uninitialized followers found.");
                    }
                }
                catch (Exception e)
                {
                    log.Error("Exception occurred: {0}", e.ToString());
                }

                unitOfWork.ReleaseLock(lockObject);
            }

            log.Info("(-):{0}", res);
            return(res);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Removes neighborhood actions whose target servers do not exist in our database.
        /// </summary>
        /// <returns>true if the function succeeds, false otherwise.</returns>
        private bool DeleteInvalidNeighborhoodActions()
        {
            log.Info("()");

            bool res = false;

            using (UnitOfWork unitOfWork = new UnitOfWork())
            {
                DatabaseLock[] lockObjects = new DatabaseLock[] { UnitOfWork.NeighborLock, UnitOfWork.FollowerLock, UnitOfWork.NeighborhoodActionLock };
                unitOfWork.AcquireLock(lockObjects);
                try
                {
                    List <byte[]>    neighborIds        = unitOfWork.NeighborRepository.Get().Select(n => n.NeighborId).ToList();
                    HashSet <byte[]> neighborIdsHashSet = new HashSet <byte[]>(neighborIds, StructuralEqualityComparer <byte[]> .Default);

                    List <byte[]>    followerIds        = unitOfWork.FollowerRepository.Get().Select(f => f.FollowerId).ToList();
                    HashSet <byte[]> followerIdsHashSet = new HashSet <byte[]>(followerIds, StructuralEqualityComparer <byte[]> .Default);

                    List <NeighborhoodAction> actions = unitOfWork.NeighborhoodActionRepository.Get().ToList();
                    bool saveDb = false;
                    foreach (NeighborhoodAction action in actions)
                    {
                        bool actionValid = false;
                        if (action.IsActivityAction())
                        {
                            // Action's serverId should be our follower.
                            actionValid = followerIdsHashSet.Contains(action.ServerId);
                        }
                        else
                        {
                            // Action's serverId should be our neighbor.
                            actionValid = neighborIdsHashSet.Contains(action.ServerId);
                        }

                        if (!actionValid)
                        {
                            log.Debug("Removing invalid action ID {0}, type {1}, server ID '{2}'.", action.Id, action.Type, action.ServerId.ToHex());
                            unitOfWork.NeighborhoodActionRepository.Delete(action);
                            saveDb = true;
                        }
                    }

                    if (saveDb)
                    {
                        res = unitOfWork.Save();
                    }
                    else
                    {
                        log.Debug("No invalid neighborhood actions found.");
                        res = true;
                    }
                }
                catch (Exception e)
                {
                    log.Error("Exception occurred: {0}", e.ToString());
                }

                unitOfWork.ReleaseLock(lockObjects);
            }

            log.Info("(-):{0}", res);
            return(res);
        }