protected override void FirstPassProducerRun()

in AdlsDotNetSDK/FileTransfer/FileUploader.cs [143:212]


        protected override void FirstPassProducerRun()
        {
            do
            {
                if (CancelToken.IsCancellationRequested)
                {
                    return;
                }
                var dir = UploaderProducerQueue.Poll();

                if (dir == null) //Means end of Producer
                {
                    UploaderProducerQueue.Add(null); //Notify if any other threads are waiting
                    return;
                }
                try
                {
                    long numSubDirs = 0, isEmpty=0;
                    IEnumerable<DirectoryInfo> enumDir = dir.EnumerateDirectories();
                    foreach (var subDir in enumDir)
                    {
                        isEmpty = 1;
                        if (NotRecurse) //Directly add the directories to be created since we won't go in recursively
                        {
                            if (!AddDirectoryToConsumerQueue(subDir.FullName, true))
                            {
                                continue;
                            }
                        }
                        else
                        {
                            UploaderProducerQueue.Add(subDir);
                        }
                        numSubDirs++;
                    }

                    IEnumerable<FileInfo> enumFiles = dir.EnumerateFiles();
                    long numFiles = 0, totChunks = 0, unchunkedFiles = 0, totSize = 0;
                    foreach (var file in enumFiles)
                    {
                        isEmpty = 1;
                        if (RecordedMetadata.EntryTransferredSuccessfulLastTime(file.FullName))
                        {
                            continue;
                        }
                        long fileSizeToTransfer;
                        long chunks = AddFileToConsumerQueue(file.FullName, file.Length, file.Length > ChunkSize, out fileSizeToTransfer);
                        totChunks += chunks;
                        if (file.Length <= ChunkSize)
                        {
                            unchunkedFiles++;
                        }
                        numFiles++;
                        totSize += fileSizeToTransfer;
                    }
                    bool isDirectoryEmptyAndNotUploadedYet = false;
                    if (isEmpty == 0)
                    {
                        isDirectoryEmptyAndNotUploadedYet = AddDirectoryToConsumerQueue(dir.FullName, true);
                    }
                    // If there are any directories and it is not recurse update the number of directories
                    StatusUpdate(numFiles, unchunkedFiles, totChunks, totSize, NotRecurse ? numSubDirs : (isDirectoryEmptyAndNotUploadedYet ? 1 : 0));
                }
                catch (Exception ex)
                {
                    Status.EntriesFailed.Add(new SingleEntryTransferStatus(dir.FullName, null, ex.StackTrace,
                        EntryType.Directory, SingleChunkStatus.Failed));
                }
            } while (!NotRecurse);
        }