Esempio n. 1
0
        public void TestMongoCompletedExtractJobDoc_GetHashCode()
        {
            var doc1 = new MongoCompletedExtractJobDoc(_testExtractJobDoc, _dateTimeProvider.UtcNow());
            var doc2 = new MongoCompletedExtractJobDoc(_testExtractJobDoc, _dateTimeProvider.UtcNow());

            Assert.AreEqual(doc1.GetHashCode(), doc2.GetHashCode());
        }
Esempio n. 2
0
        public void TestMongoCompletedExtractJobDoc_Equality()
        {
            var doc1 = new MongoCompletedExtractJobDoc(_testExtractJobDoc, _dateTimeProvider.UtcNow());
            var doc2 = new MongoCompletedExtractJobDoc(_testExtractJobDoc, _dateTimeProvider.UtcNow());

            Assert.AreEqual(doc1, doc2);
        }
Esempio n. 3
0
 public static CompletedExtractJobInfo ToExtractJobInfo(this MongoCompletedExtractJobDoc mongoCompletedExtractJobDoc)
 => new CompletedExtractJobInfo(
     mongoCompletedExtractJobDoc.ExtractionJobIdentifier,
     mongoCompletedExtractJobDoc.JobSubmittedAt,
     mongoCompletedExtractJobDoc.CompletedAt,
     mongoCompletedExtractJobDoc.ProjectNumber,
     mongoCompletedExtractJobDoc.ExtractionDirectory,
     mongoCompletedExtractJobDoc.KeyTag,
     mongoCompletedExtractJobDoc.KeyCount,
     mongoCompletedExtractJobDoc.ExtractionModality,
     mongoCompletedExtractJobDoc.IsIdentifiableExtraction,
     mongoCompletedExtractJobDoc.IsNoFilterExtraction
     );
Esempio n. 4
0
        protected override CompletedExtractJobInfo GetCompletedJobInfoImpl(Guid jobId)
        {
            MongoCompletedExtractJobDoc jobDoc =
                _completedJobCollection
                .FindSync(Builders <MongoCompletedExtractJobDoc> .Filter.Eq(x => x.ExtractionJobIdentifier, jobId))
                .SingleOrDefault();

            if (jobDoc == null)
            {
                throw new ApplicationException($"No completed document for job {jobId}");
            }

            return(jobDoc.ToExtractJobInfo());
        }
Esempio n. 5
0
        public void TestMongoCompletedExtractJobDoc_Constructor_ExtractJobStatus()
        {
            var doc = new MongoCompletedExtractJobDoc(_testExtractJobDoc, _dateTimeProvider.UtcNow());

            Assert.AreEqual(ExtractJobStatus.Completed, doc.JobStatus);
        }
Esempio n. 6
0
        protected override void CompleteJobImpl(Guid jobId)
        {
            //TODO Docs

            using (IClientSessionHandle session = _client.StartSession())
            {
                session.StartTransaction();
                string expectedCollNameForJob = ExpectedFilesCollectionName(jobId);
                string statusCollNameForJob   = StatusCollectionName(jobId);

                try
                {
                    if (!TryGetMongoExtractJobDoc(jobId, out MongoExtractJobDoc toComplete))
                    {
                        throw new ApplicationException($"Could not find job {jobId} in the job store");
                    }

                    if (toComplete.JobStatus == ExtractJobStatus.Failed)
                    {
                        throw new ApplicationException($"Job {jobId} is marked as failed");
                    }

                    var completedJob = new MongoCompletedExtractJobDoc(toComplete, _dateTimeProvider.UtcNow());
                    _completedJobCollection.InsertOne(completedJob);

                    DeleteResult res = _inProgressJobCollection.DeleteOne(GetFilterForSpecificJob <MongoExtractJobDoc>(jobId));
                    if (!res.IsAcknowledged)
                    {
                        throw new ApplicationException("Job data was archived but could not delete original from job store");
                    }

                    // Move the associated docs from each collection to the archives

                    IMongoCollection <MongoExpectedFilesDoc> expectedTempCollection = _database.GetCollection <MongoExpectedFilesDoc>(expectedCollNameForJob);
                    if (expectedTempCollection.CountDocuments(FilterDefinition <MongoExpectedFilesDoc> .Empty) == 0)
                    {
                        throw new ApplicationException($"Collection of MongoExpectedFilesDoc for job {jobId} was missing or empty");
                    }
                    using (IAsyncCursor <MongoExpectedFilesDoc> cursor = expectedTempCollection.FindSync(FilterDefinition <MongoExpectedFilesDoc> .Empty))
                    {
                        while (cursor.MoveNext())
                        {
                            _completedExpectedFilesCollection.InsertMany(cursor.Current);
                        }
                    }

                    IMongoCollection <MongoFileStatusDoc> statusTemp = _database.GetCollection <MongoFileStatusDoc>(statusCollNameForJob);
                    if (statusTemp.CountDocuments(FilterDefinition <MongoFileStatusDoc> .Empty) == 0)
                    {
                        throw new ApplicationException($"Collection of MongoFileStatusDoc for job {jobId} was missing or empty");
                    }
                    using (IAsyncCursor <MongoFileStatusDoc> cursor = statusTemp.FindSync(FilterDefinition <MongoFileStatusDoc> .Empty))
                    {
                        while (cursor.MoveNext())
                        {
                            _completedStatusCollection.InsertMany(cursor.Current);
                        }
                    }
                }
                catch (Exception)
                {
                    Logger.Debug("Caught exception from transaction. Aborting before re-throwing");
                    session.AbortTransaction();
                    throw;
                }

                // TODO(rkm 2020-03-03) Can potentially add a retry here
                session.CommitTransaction();

                // NOTE(rkm 2020-03-09) "Operations that affect the database catalog, such as creating or dropping a collection or an index, are not allowed in transactions"
                _database.DropCollection(expectedCollNameForJob);
                _database.DropCollection(statusCollNameForJob);
            }
        }