Skip to content

Commit 5551bf4

Browse files
dhruvin-kalavadiaDhruvin Kalavadia
andauthored
Duplicate key error fix (#514)
* Fix for duplicate key error in event-to-object map collection * Formatting changes * Added missing import statement after rebasing changes with master * updated eiffel-intelligence version to 3.2.5 * revert back ei version to 3.2.4 in pom.xml * Updated method parameters in Javadoc Co-authored-by: Dhruvin Kalavadia <dhruvin.kalavadia@ericsson.com>
1 parent f94afaa commit 5551bf4

File tree

3 files changed

+54
-6
lines changed

3 files changed

+54
-6
lines changed

src/main/java/com/ericsson/ei/handlers/EventToObjectMapHandler.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import javax.annotation.PostConstruct;
2323

24+
import org.apache.commons.lang3.StringUtils;
2425
import org.bson.Document;
2526
import org.slf4j.Logger;
2627
import org.slf4j.LoggerFactory;
@@ -35,6 +36,7 @@
3536
import com.ericsson.ei.mongo.MongoDBHandler;
3637
import com.ericsson.ei.mongo.MongoStringQuery;
3738
import com.ericsson.ei.rules.RulesObject;
39+
import com.fasterxml.jackson.annotation.JsonIgnore;
3840
import com.fasterxml.jackson.core.type.TypeReference;
3941
import com.fasterxml.jackson.databind.JsonNode;
4042
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -65,14 +67,14 @@ public class EventToObjectMapHandler {
6567
@Autowired
6668
JmesPathInterface jmesPathInterface;
6769

68-
@Value("${aggregations.collection.ttl:0}")
70+
@Value("${aggregations.collection.ttl}")
6971
private String eventToObjectTtl;
7072

7173
@PostConstruct
7274
public void init() throws AbortExecutionException {
7375
try {
74-
if (Integer.parseInt(eventToObjectTtl) > 0) {
75-
mongodbhandler.createTTLIndex(databaseName, collectionName, MongoConstants.TIME, Integer.parseInt(eventToObjectTtl));
76+
if (getTtl() > 0) {
77+
mongodbhandler.createTTLIndex(databaseName, collectionName, MongoConstants.TIME, getTtl());
7678
}
7779
} catch (Exception e) {
7880
LOGGER.error("Failed to create an index for {} due to: {}", collectionName, e);
@@ -135,7 +137,7 @@ public void updateEventToObjectMapInMemoryDB(RulesObject rulesObject, String eve
135137
mapStr, databaseName, collectionName);
136138
Document document = Document.parse(mapStr);
137139
document.append("Time", DateUtils.getDate());
138-
mongodbhandler.insertDocumentObject(databaseName, collectionName, document);
140+
mongodbhandler.insertDocumentObject(databaseName, collectionName, document, condition, eventId);
139141
} else {
140142
mongodbhandler.updateDocumentAddToSet(databaseName, collectionName, condition,
141143
eventId);
@@ -194,5 +196,24 @@ public boolean isEventInEventObjectMap(String eventId) {
194196
List<String> documents = mongodbhandler.find(databaseName, collectionName, query);
195197
return !documents.isEmpty();
196198
}
197-
199+
200+
/**
201+
* This method gives the TTL (time to live) value for documents stored in the database. This
202+
* value is set in application.properties when starting Eiffel Intelligence.
203+
*
204+
* @return ttl Integer value representing time to live for documents
205+
*/
206+
@JsonIgnore
207+
public int getTtl() {
208+
int ttl = 0;
209+
if (StringUtils.isNotEmpty(eventToObjectTtl)) {
210+
try {
211+
ttl = Integer.parseInt(eventToObjectTtl);
212+
} catch (NumberFormatException e) {
213+
LOGGER.error("Failed to parse TTL value.", e);
214+
}
215+
}
216+
return ttl;
217+
}
218+
198219
}

src/main/java/com/ericsson/ei/mongo/MongoDBHandler.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.ericsson.ei.handlers.DateUtils;
3636
import com.fasterxml.jackson.annotation.JsonIgnore;
3737
import com.mongodb.BasicDBObject;
38+
import com.mongodb.ErrorCategory;
3839
import com.mongodb.MongoClientException;
3940
import com.mongodb.MongoCommandException;
4041
import com.mongodb.MongoConfigurationException;
@@ -122,9 +123,12 @@ public void insertDocument(String dataBaseName, String collectionName, String in
122123
* @param dataBaseName
123124
* @param collectionName
124125
* @param document - Document object to insert
126+
* @param condition - a condition to find a requested object in the database
127+
* @param eventId - eventId to update in the mapper collection
125128
* @throws MongoWriteException
126129
*/
127-
public void insertDocumentObject(String dataBaseName, String collectionName, Document document) throws MongoWriteException {
130+
public void insertDocumentObject(String dataBaseName, String collectionName, Document document, MongoCondition condition, String eventId)
131+
throws MongoWriteException {
128132
try {
129133
MongoCollection<Document> collection = getMongoCollection(dataBaseName, collectionName);
130134

@@ -137,6 +141,11 @@ public void insertDocumentObject(String dataBaseName, String collectionName, Doc
137141
collectionName, dataBaseName);
138142
}
139143

144+
} catch(MongoWriteException e) {
145+
if(e.getError().getCategory() == ErrorCategory.DUPLICATE_KEY) {
146+
LOGGER.debug("Duplicate key insertion for {} in collection {} and Update event-to-object map collection for condition {} with eventId {}", document, collectionName, condition, eventId);
147+
updateDocumentAddToSet(dataBaseName, collectionName, condition, eventId);
148+
}
140149
} catch (Exception e) {
141150
LOGGER.error("Failed to insert Object: {} \n in collection: {} and database {}. \n {}", document,
142151
collectionName, dataBaseName, e.getMessage());

src/test/java/com/ericsson/ei/mongo/MongoDBHandlerTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import static org.mockito.Mockito.when;
2424

2525
import java.util.ArrayList;
26+
import java.util.List;
2627

28+
import org.bson.Document;
2729
import org.junit.Before;
2830
import org.junit.Test;
2931
import org.mockito.Mockito;
@@ -49,6 +51,9 @@ public class MongoDBHandlerTest {
4951
"testid1");
5052
private String inputForEventToObjectMap = "{\"_id\" : \"testid1\", \"objects\" : [\"eventid1\", \"eventid2\"]}";
5153
private String updateInputForEventToObjectMap = "\"eventid3\"";
54+
private String inputForEventToObjectMapDuplicate = "{\"_id\" : \"testid1\", \"objects\" : [\"eventid4\"]}";
55+
private String updateInputForEventToObjectMapDuplicate = "eventid4";
56+
Document document = Document.parse(inputForEventToObjectMapDuplicate);
5257

5358
@Before
5459
public void init() throws Exception {
@@ -98,6 +103,19 @@ public void updateEventToObjectMap() {
98103
assertTrue(mongoDBHandler.updateDocumentAddToSet(dataBaseName, mapCollectionName,
99104
conditionForEventToObjectMap, updateInputForEventToObjectMap));
100105
}
106+
107+
@Test
108+
public void insertEventToObjectMapDuplicate() {
109+
mongoDBHandler.insertDocumentObject(dataBaseName, mapCollectionName, document, conditionForEventToObjectMap, updateInputForEventToObjectMapDuplicate);
110+
assertTrue(isEventInEventObjectMap(updateInputForEventToObjectMapDuplicate));
111+
}
112+
113+
public boolean isEventInEventObjectMap(String eventId) {
114+
String condition = "{\"objects\": { \"$in\" : [\"" + eventId + "\"]} }";
115+
MongoStringQuery query = new MongoStringQuery(condition);
116+
List<String> documents = mongoDBHandler.find(dataBaseName, mapCollectionName, query);
117+
return !documents.isEmpty();
118+
}
101119

102120
@Test
103121
public void checkMongoDBStatusUp() {

0 commit comments

Comments
 (0)