/// <summary> /// Tidy-up the state after a transfer has been completed or when an /// error has occurred. /// </summary> private void GoIdle() { Phase1Payload = null; UploadTree = null; Task = MetaDataTask.None; Status = MetaDataManagerStatus.Idle; CommitIDSet.Clear(); WantedCommitID = 0; Share.NotifyIfKfsIdle(); }
/// <summary> /// Begin executing the operation. /// </summary> public void StartOperation() { Debug.Assert(Status == MetaDataManagerStatus.Queued); Debug.Assert(TransferThread == null); Debug.Assert(Phase1Payload != null); Debug.Assert(Ticket != null); try { // Start the transfer. TransferThread = new KfsMetaDataThread(Share, Ticket, Phase1Payload); TransferThread.Start(); Status = MetaDataManagerStatus.Exec; Phase1Payload = null; Ticket = null; } catch (Exception ex) { Share.FatalError(ex); } }
/// <summary> /// Queue a meta-data operation for execution. /// </summary> public void QueueOperation(KfsPhase1Payload payload, SortedDictionary<UInt64, KfsFileUpload> uploadTree, MetaDataTask task) { Debug.Assert(Status == MetaDataManagerStatus.Idle); Phase1Payload = payload; if (uploadTree == null) UploadTree = new SortedDictionary<UInt64, KfsFileUpload>(); else UploadTree = uploadTree; Task = task; Status = MetaDataManagerStatus.Queued; }
/// <summary> /// This method is called when a upload ticket reply is received. /// </summary> public void OnTicket(AnpMsg m) { Debug.Assert(Status == MetaDataManagerStatus.Ticket); Debug.Assert(Phase1Payload != null); Debug.Assert(Ticket == null); // Store the ticket and run the pipeline. if (m.Type == KAnpType.KANP_RES_KFS_UPLOAD_REQ) { Status = MetaDataManagerStatus.Queued; Ticket = m.Elements[0].Bin; Share.Pipeline.Run("got meta-data ticket", false); } // On failure, cancel all uploads. else { ReportError(m.Elements[0].String); Share.Pipeline.Run("could not obtain meta-data ticket", true); } }
/// <summary> /// This method is called when the operation has been completed. /// 'reason' is null if the thread has been cancelled. /// </summary> public void OnCompletion(bool successFlag, String reason, UInt64 commitID) { // Join with the transfer thread. Debug.Assert(TransferThread != null); TransferThread = null; // The operation failed. if (!successFlag) { ReportError(reason); Share.Pipeline.Run("meta-data execution failed", true); } // The operation succeeded. else { // We already got the server event. Call the handler function. if (CommitIDSet.Contains(commitID)) OnCommitIDReceived(); // We're now waiting for the phase 1 event. else { Status = MetaDataManagerStatus.Phase1; WantedCommitID = commitID; } } }
/// <summary> /// Ask an upload ticket. /// </summary> public void AskTicket() { Debug.Assert(Status == MetaDataManagerStatus.Queued); Debug.Assert(Ticket == null); Share.AskUploadTicket(); Status = MetaDataManagerStatus.Ticket; }