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>(); }
// 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()); } } }