Beispiel #1
0
        internal List<FailedDocument> InsertDocuments(ICollection<JSONDocument> documents, bool noResponse = false)
        {
            InsertDocumentsOperation insertOperation = new InsertDocumentsOperation();
            insertOperation.Documents = documents.Cast<IJSONDocument>().ToList();
            insertOperation.Database = _database.DatabaseName;
            insertOperation.Collection = _collectionName;
            insertOperation.NoResponse = noResponse;

            InsertDocumentsResponse insertResponse = (InsertDocumentsResponse)_database.ExecutionMapper.InsertDocuments(insertOperation);

            if (!insertResponse.IsSuccessfull)
            {
                if (insertResponse.FailedDocumentsList == null || insertResponse.FailedDocumentsList.Count == 0)
                {
                    throw new DataException(ErrorMessages.GetErrorMessage(insertResponse.ErrorCode, insertResponse.ErrorParams));
                }
                return insertResponse.FailedDocumentsList;
            }
            return new List<FailedDocument>();
        }
Beispiel #2
0
        // manages status and adds data to collection
        private void InsertData(DataSlice slice)
        {
            List <string> collectionsPersisted = new List <string>();// list of collections that have been persisted, this is useful for status

            try
            {
                if (slice.Data != null)
                {
                    ArrayList documentsList = CompactBinaryFormatter.FromByteBuffer(slice.Data, string.Empty) as ArrayList;

                    InsertDocumentsOperation insertOperation = new InsertDocumentsOperation();
                    insertOperation.Documents  = documentsList.Cast <IJSONDocument>().ToList();
                    insertOperation.Database   = Database;
                    insertOperation.Collection = slice.SliceHeader.Collection;

                    if (documentsList.Count != slice.SliceHeader.DataCount)
                    {
                        if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsInfoEnabled)
                        {
                            LoggerManager.Instance.RecoveryLogger.Info("DatabaseRecoveryJob.Run()", "Document not same original: " + slice.SliceHeader.DataCount + " restored : " + documentsList.Count);
                        }
                    }
                    int  i       = 0;
                    bool success = false;

                    while (i < 3 && !success)
                    {
                        try
                        {
                            if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsInfoEnabled)
                            {
                                LoggerManager.Instance.RecoveryLogger.Info("DatabaseRecoveryJob.Run()", slice.SliceHeader.Collection + "_" + slice.SliceHeader.DataCount + " Insrt op" + i + " send at " + DateTime.Now);
                            }

                            InsertDocumentsResponse insertResponse = (InsertDocumentsResponse)_context.TopologyImpl.InsertDocuments(insertOperation);

                            if (!insertResponse.IsSuccessfull)
                            {
                                i++;
                                success          = false;
                                _failedDocuments = _failedDocuments.Union(insertResponse.FailedDocumentsList).ToList();

                                if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsInfoEnabled)
                                {
                                    LoggerManager.Instance.RecoveryLogger.Info("DatabaseRecoveryJob.Run()", "ErrorCode: " + insertResponse.ErrorCode + "\t Error: " + insertResponse.Error + " \tFailed Documents Count: " + _failedDocuments.Count);
                                }

                                // will think of something to do with this failure
                                List <IJSONDocument> retryList    = new List <IJSONDocument>();
                                List <IJSONDocument> originalList = insertOperation.Documents.ToList();
                                foreach (FailedDocument failedDoc in insertResponse.FailedDocumentsList)
                                {
                                    foreach (IJSONDocument orgDoc in originalList)
                                    {
                                        if (orgDoc.Key.Equals(failedDoc.DocumentKey))
                                        {
                                            retryList.Add(orgDoc);
                                        }
                                    }
                                }

                                insertOperation.Documents = retryList;
                            }
                            else
                            {
                                success = true;
                            }
                        }
                        catch (Exception exp)
                        {
                            if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsErrorEnabled)
                            {
                                LoggerManager.Instance.RecoveryLogger.Error("DatabaseRecoveryJob.Run() ", slice.SliceHeader.Collection + " " + exp.ToString());
                            }
                            i++;
                            success = false;
                            // Extreme Hack
                            Thread.Sleep(5000);
                        }
                    }
                }
                else
                if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsErrorEnabled)
                {
                    LoggerManager.Instance.RecoveryLogger.Error("DatabaseRecoveryJob.Restore()", "slice.Data is null " + slice.HeaderSize.ToString());
                }

                if (!collectionsPersisted.Contains(slice.SliceHeader.Collection))
                {
                    collectionsPersisted.Add(slice.SliceHeader.Collection);

                    ExecutionStatus.Status = RecoveryStatus.Executing;
                    ExecutionStatus.PercentageExecution = collectionsPersisted.Count / Collections.Count;//[M_NOTE] rudementary logic, change this
                    ExecutionStatus.MessageTime         = DateTime.Now;
                    ExecutionStatus.Message             = "Restoring " + Database + "_" + slice.SliceHeader.Collection;
                }
            }
            catch (Exception ex)
            {
                if (LoggerManager.Instance.RecoveryLogger != null && LoggerManager.Instance.RecoveryLogger.IsErrorEnabled)
                {
                    LoggerManager.Instance.RecoveryLogger.Error("DatabaseRecoveryJob.Run() ", slice.SliceHeader.Collection + " " + ex.ToString());
                }
            }
        }