예제 #1
0
        /// <summary>
        /// Copies content from a path in the XStore to the destination path in the XStore
        /// </summary>
        /// <param name="remoteSource"> Location relative to RootUri where the content to be copied will be found. </param>
        /// <param name="remoteDestination"> Location relative to RootUri where the content needs to be copied. </param>
        /// <param name="timeout">The timeout for performing the copying operation.</param>
        /// <param name="skipFiles">The list of the blobs to be skipped for copying </param>
        /// <param name="copyFlag">The copying control information to specify how blob can be overwritten.</param>
        /// <param name="checkMarkFile">Indicats whether to check mark file during copying.</param>
        public void CopyContent(string remoteSource, string remoteDestination, TimeSpan timeout, string[] skipFiles, CopyFlag copyFlag, bool checkMarkFile)
        {
            TimeoutHelper helper = timeout == TimeSpan.MaxValue ? null : new TimeoutHelper(timeout);

            try
            {
                using (
                    XStoreFileOperations xstoreFileOperation =
                        new XStoreFileOperations(new XStoreParameters(this.providerParams.ConnectionString, this.providerParams.SecondaryConnectionString, this.providerParams.ContainerName)))
                {
                    remoteSource      = XStoreCommon.FormatXStoreUri(remoteSource);
                    remoteDestination = XStoreCommon.FormatXStoreUri(remoteDestination);

                    bool xstoreFileExist   = xstoreFileOperation.XStoreFileExists(remoteSource, helper);
                    bool xstoreFolderExist = xstoreFileOperation.XStoreFolderExists(remoteSource, checkMarkFile, helper);

                    if ((!xstoreFileExist) && (!xstoreFolderExist))
                    {
                        throw new FileNotFoundException(string.Format(CultureInfo.InvariantCulture, StringResources.ImageStoreError_DoesNotExistError, remoteSource));
                    }

                    if (copyFlag == CopyFlag.AtomicCopy)
                    {
                        this.DeleteContent(remoteDestination, helper == null ? timeout : helper.GetRemainingTime());
                    }

                    if (xstoreFileExist)
                    {
                        // this is a single blob copy from xstore to xstore
                        xstoreFileOperation.CopyFile(
                            remoteSource,
                            remoteDestination,
                            XStoreFileOperationType.CopyFromXStoreToXStore,
                            helper);
                    }
                    else
                    {
                        xstoreFileOperation.CopyFolder(
                            remoteSource,
                            remoteDestination,
                            XStoreFileOperationType.CopyFromXStoreToXStore,
                            copyFlag,
                            null,
                            skipFiles,
                            helper);
                    }
                }
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
                throw;
            }
        }
예제 #2
0
        /// <summary>
        /// Downloads content from the XStore to local destination.
        /// </summary>
        /// <param name="tag">Location (relative to RootUri) from where to download the content.</param>
        /// <param name="destinationSoftLink">Physical location where to download the content.</param>
        /// <param name="handler">Defines the behavior to process progress information from the downloading operation.</param>
        /// <param name="timeout">The timeout for performing the downloading operation.</param>
        /// <param name="copyFlag">The copying control information to specify how file can be overwritten.</param>
        public void DownloadContent(string tag, string destinationSoftLink, IImageStoreProgressHandler handler, TimeSpan timeout, CopyFlag copyFlag)
        {
            TimeoutHelper helper = timeout == TimeSpan.MaxValue ? null : new TimeoutHelper(timeout);

            destinationSoftLink = this.GetLocalPath(destinationSoftLink);
            try
            {
                using (XStoreFileOperations xstoreFileOperation =
                           new XStoreFileOperations(new XStoreParameters(this.providerParams.ConnectionString, this.providerParams.SecondaryConnectionString, this.providerParams.ContainerName)))
                {
                    tag = XStoreCommon.FormatXStoreUri(tag);
                    bool xstoreFileExist   = xstoreFileOperation.XStoreFileExists(tag, helper);
                    bool xstoreFolderExist = xstoreFileOperation.XStoreFolderExists(tag, true, helper);

                    if ((!xstoreFileExist) && (!xstoreFolderExist))
                    {
                        throw new FileNotFoundException(string.Format(CultureInfo.InvariantCulture, StringResources.ImageStoreError_DoesNotExistError, tag));
                    }

                    if (xstoreFileExist)
                    {
                        // this is a single blob copy from xstore to smb
                        xstoreFileOperation.CopyFile(
                            tag,
                            destinationSoftLink,
                            XStoreFileOperationType.CopyFromXStoreToSMB,
                            helper);
                    }
                    else
                    {
                        // this is a multiple blob (folder) copy from xstore to smb
                        xstoreFileOperation.CopyFolder(
                            tag,
                            destinationSoftLink,
                            XStoreFileOperationType.CopyFromXStoreToSMB,
                            copyFlag,
                            null,
                            null,
                            helper);
                    }
                }
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
                throw;
            }
        }
예제 #3
0
        /// <summary>
        /// Check if content is present in the store.
        /// </summary>
        /// <param name="tag"> Location (relative to RootUri) where to check the presence of the content. </param>
        /// <param name="timeout">The timeout for performing the checking existence operation</param>
        /// <returns> True if the content exists, false otherwise. </returns>
        public bool DoesContentExist(string tag, TimeSpan timeout)
        {
            TimeoutHelper helper  = timeout == TimeSpan.MaxValue ? null : new TimeoutHelper(timeout);
            bool          isExist = false;

            try
            {
                using (
                    XStoreFileOperations xstoreFileOperation =
                        new XStoreFileOperations(new XStoreParameters(this.providerParams.ConnectionString, this.providerParams.SecondaryConnectionString, this.providerParams.ContainerName)))
                {
                    tag     = XStoreCommon.FormatXStoreUri(tag);
                    isExist = xstoreFileOperation.XStoreFileExists(tag, helper) || xstoreFileOperation.XStoreFolderExists(tag, true, helper);
                }
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
                throw;
            }

            return(isExist);
        }
예제 #4
0
        /// <summary>
        /// Downloads content from the XStore to local destination.
        /// </summary>
        /// <param name="tag">Location (relative to RootUri) from where to download the content.</param>
        /// <param name="destinationSoftLink">Physical location where to download the content.</param>
        /// <param name="handler">Defines the behavior to process progress information from the downloading operation.</param>
        /// <param name="timeout">The timeout for performing the downloading operation.</param>
        /// <param name="copyFlag">The copying control information to specify how file can be overwritten.</param>
        public void DownloadContent(string tag, string destinationSoftLink, IImageStoreProgressHandler handler, TimeSpan timeout, CopyFlag copyFlag)
        {
            TimeoutHelper helper = timeout == TimeSpan.MaxValue ? null : new TimeoutHelper(timeout);

            destinationSoftLink = this.GetLocalPath(destinationSoftLink);
            try
            {
                using (XStoreFileOperations xstoreFileOperation =
                           new XStoreFileOperations(new XStoreParameters(this.providerParams.ConnectionString, this.providerParams.SecondaryConnectionString, this.providerParams.ContainerName)))
                {
                    tag = XStoreCommon.FormatXStoreUri(tag);
                    bool xstoreFileExist   = xstoreFileOperation.XStoreFileExists(tag, helper);
                    bool xstoreFolderExist = xstoreFileOperation.XStoreFolderExists(tag, true, helper);

                    if ((!xstoreFileExist) && (!xstoreFolderExist))
                    {
                        throw new FileNotFoundException(string.Format(CultureInfo.InvariantCulture, StringResources.ImageStoreError_DoesNotExistError, tag));
                    }

                    if (xstoreFileExist)
                    {
                        // this is a single blob copy from xstore to smb
                        xstoreFileOperation.CopyFile(
                            tag,
                            destinationSoftLink,
                            XStoreFileOperationType.CopyFromXStoreToSMB,
                            helper);
                    }
                    else
                    {
                        var operationId = Guid.NewGuid();

                        // this is a multiple blob (folder) copy from xstore to smb
                        xstoreFileOperation.CopyFolder(
                            tag,
                            destinationSoftLink,
                            XStoreFileOperationType.CopyFromXStoreToSMB,
                            copyFlag,
                            null,
                            null,
                            helper,
                            operationId);

                        var blobContentEntries = XStoreCommon.GetDownloadContentEntries(operationId);
                        if (blobContentEntries == null)
                        {
                            return;
                        }

                        var missingFiles = blobContentEntries.Where(entry => !File.Exists(entry.Item2));
                        if (missingFiles.Count() > 0)
                        {
                            //The missing file count will be traced out and there will be no retrying without remaining time.
                            //The following step to do will return proper error code after sync up with hosting and image builder.
                            if (helper != null && helper.GetRemainingTime() == TimeSpan.Zero)
                            {
                                this.traceSource.WriteWarning(
                                    ClassName,
                                    "{0} files missing after downloading, OperationID: {1}", missingFiles.Count(), operationId);
                                return;
                            }

                            this.traceSource.WriteWarning(
                                ClassName,
                                "Retry to download the {0} missing files, operationID: {1}", missingFiles.Count(), operationId);

                            foreach (var file in missingFiles)
                            {
                                xstoreFileOperation.CopyFile(
                                    file.Item1,
                                    file.Item2,
                                    XStoreFileOperationType.CopyFromXStoreToSMB,
                                    helper);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
                throw;
            }
        }