/// <summary> /// Adds iFolder move request to the iFolder move queue /// </summary> /// <param name="ifDataMove">iFolder data move object</param> /// <returns> false in all cases.</returns> static public bool Add(iFolderDataMove ifDataMove) { log.Debug("Add: Adding iFolder id {0}:{1} to the Data Move Queue", ifDataMove.iFolderID, ifDataMove.iFolderName); lock ( eventQueue ) { if (eventQueue.Count != 0) { Array ifDataMoveList = Array.CreateInstance(typeof(iFolderDataMove), eventQueue.Count); eventQueue.CopyTo(ifDataMoveList, 0); foreach (iFolderDataMove ifDM in ifDataMoveList) { if (ifDM.iFolderID == ifDataMove.iFolderID) { log.Debug("Add: iFolder {0}:{1} is already in the queue", ifDataMove.iFolderID, ifDataMove.iFolderName); return(false); } } } if (currentiFolderID == ifDataMove.iFolderID) { log.Debug("Not adding in the queue since this iFolder is being synced now. {0}", currentiFolderID); return(false); } eventQueue.Enqueue(ifDataMove); log.Debug("Add: iFolder id {0} is included in the queue", ifDataMove.iFolderID); } return(false); }
/// <summary> /// IsiFolderAlreadyInQueueOrMoved check whether iFolder is in queue or already moved. /// </summary> /// <param name="ifDataMove">iFolder data move object</param> /// <returns> True if the iFolder is already moved, /// false if iFolder is not moved or in queue</returns> static public bool IsiFolderAlreadyInQueueOrMoved(iFolderDataMove ifDataMove) { log.Debug("IsiFolderAlreadyInQueueOrMoved: Checking iFolder id {0}:{1} in the Data Move Queue", ifDataMove.iFolderID, ifDataMove.iFolderName); lock ( eventQueue ) { if (eventQueue.Count != 0) { Array ifDataMoveList = Array.CreateInstance(typeof(iFolderDataMove), eventQueue.Count); eventQueue.CopyTo(ifDataMoveList, 0); foreach (iFolderDataMove ifDM in ifDataMoveList) { if (ifDM.iFolderID == ifDataMove.iFolderID) { log.Debug("IsiFolderAlreadyInQueueOrMoved: iFolder {0}:{1} is already in the queue", ifDataMove.iFolderID, ifDataMove.iFolderName); return(false); } } } } store = Store.GetStore(); domain = store.GetDomain(store.DefaultDomain); Member member = domain.GetMemberByID(ifDataMove.MemberUserID); if (member != null) { int state = member.iFolderMoveState(domain.ID, false, ifDataMove.iFolderID, 0, 0); if (state == (int)iFolderMoveState.Completed) { log.Debug("State completed for: {0}", ifDataMove.iFolderName); member.iFolderMoveState(domain.ID, true, ifDataMove.iFolderID, 0, 0); return(true); } else if (state == (int)iFolderMoveState.NotStarted) { log.Debug("State already moved for: {0}", ifDataMove.iFolderName); if (store.GetCollectionByID(ifDataMove.iFolderID) != null) { return(true); } } } return(false); }
/// <summary> /// Processes the Data Move queue, either periodically or based on the manual reset event. /// </summary> /// <returns> Nothing.</returns> static private void ProcessEvents() { store = Store.GetStore(); domain = store.GetDomain(store.DefaultDomain); iFolderDataMove ifDataMove = null; Member member = null; while (down == false) { queueEvent.WaitOne(QueEventScheduleTime * 1000, false); if (down == true) { break; } QueueProcessingState = true; while (true) { ifDataMove = null; lock ( eventQueue ) { if (eventQueue.Count == 0) { queueEvent.Reset(); break; } ifDataMove = eventQueue.Dequeue() as iFolderDataMove; } try { member = domain.GetMemberByID(ifDataMove.MemberUserID); if (member != null) { currentiFolderID = ifDataMove.iFolderID; member.iFolderMoveState(domain.ID, true, ifDataMove.iFolderID, (int)iFolderMoveState.Started, 0); if (!Collection.DownloadCollectionLocally(ifDataMove.iFolderID, ifDataMove.iFolderName, ifDataMove.DomainID, ifDataMove.HostID, ifDataMove.DirNodeID, ifDataMove.MemberUserID, ifDataMove.colMemberNodeID, ifDataMove.iFolderLocalPath, ifDataMove.sourceFileCount, ifDataMove.sourceDirCount)) { currentiFolderID = ""; log.Debug("downloadifolder returned false for {0} ", ifDataMove.iFolderID); Add(ifDataMove); Thread.Sleep(5 * 1000); } else { /// Recreate the catalog entry... Simias.Server.Catalog.RecreateEntryForCollection(ifDataMove.iFolderID); member.iFolderMoveState(domain.ID, true, ifDataMove.iFolderID, (int)iFolderMoveState.Completed, 0); } currentiFolderID = ""; } else { log.Debug("member {0} is not present in domain ", ifDataMove.MemberUserID); log.Debug("removing {0} from Data move queue", ifDataMove.iFolderID); } } catch (Exception e) { log.Debug("Data ProcessEvents: Expection {0} {1} received for {2}", e.Message, e.StackTrace, ifDataMove.iFolderID); Add(ifDataMove); Thread.Sleep(30 * 1000); } finally { currentiFolderID = ""; } } QueueProcessingState = false; } }