Example #1
0
 /// <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();
 }
Example #2
0
        /// <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);
            }
        }
Example #3
0
 /// <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;
 }
Example #4
0
        /// <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);
            }
        }
Example #5
0
        /// <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;
                }
            }
        }
Example #6
0
 /// <summary>
 /// Ask an upload ticket.
 /// </summary>
 public void AskTicket()
 {
     Debug.Assert(Status == MetaDataManagerStatus.Queued);
     Debug.Assert(Ticket == null);
     Share.AskUploadTicket();
     Status = MetaDataManagerStatus.Ticket;
 }