Skip to content

Commit

Permalink
fix: Fix CrowdSourcedData races by using concurrent collections (#2447)
Browse files Browse the repository at this point in the history
  • Loading branch information
kristofbolyai committed May 5, 2024
1 parent 0467354 commit e580f9c
Showing 1 changed file with 10 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright © Wynntils 2023.
* Copyright © Wynntils 2023-2024.
* This file is released under LGPLv3. See LICENSE for full license details.
*/
package com.wynntils.core.crowdsource;
Expand All @@ -18,7 +18,8 @@
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.stream.Collectors;

/**
Expand All @@ -27,7 +28,8 @@
* If you need to access crowd sourced data, use the {@link CrowdSourcedDataManager}.
*/
public class CrowdSourcedData {
private final Map<CrowdSourcedDataGameVersion, Map<CrowdSourcedDataType, Set<Object>>> data = new TreeMap<>();
private final Map<CrowdSourcedDataGameVersion, Map<CrowdSourcedDataType, Set<Object>>> data =
new ConcurrentSkipListMap<>();

CrowdSourcedData() {}

Expand All @@ -42,7 +44,7 @@ <T> void putData(
}

data.computeIfAbsent(version, k -> new TreeMap<>())
.computeIfAbsent(crowdSourcedDataType, k -> new TreeSet<>())
.computeIfAbsent(crowdSourcedDataType, k -> new ConcurrentSkipListSet<>())
.add(crowdSourceData);
}

Expand All @@ -67,14 +69,15 @@ public CrowdSourcedData deserialize(JsonElement jsonElement, Type type, JsonDese

JsonObject dataObject = jsonObject.getAsJsonObject("data");

Map<CrowdSourcedDataGameVersion, Map<CrowdSourcedDataType, Set<Object>>> deserializedData = new TreeMap<>();
Map<CrowdSourcedDataGameVersion, Map<CrowdSourcedDataType, Set<Object>>> deserializedData =
new ConcurrentSkipListMap<>();

for (Map.Entry<String, JsonElement> gameVersionEntry : dataObject.entrySet()) {
CrowdSourcedDataGameVersion gameVersion = context.deserialize(
new JsonPrimitive(gameVersionEntry.getKey()), CrowdSourcedDataGameVersion.class);
JsonObject gameVersionObject = gameVersionEntry.getValue().getAsJsonObject();

Map<CrowdSourcedDataType, Set<Object>> deserializedGameVersionData = new TreeMap<>();
Map<CrowdSourcedDataType, Set<Object>> deserializedGameVersionData = new ConcurrentSkipListMap<>();

for (Map.Entry<String, JsonElement> crowdSourceDataTypeEntry : gameVersionObject.entrySet()) {
try {
Expand All @@ -83,7 +86,7 @@ public CrowdSourcedData deserialize(JsonElement jsonElement, Type type, JsonDese
JsonArray crowdSourcedTypeArray =
crowdSourceDataTypeEntry.getValue().getAsJsonArray();

Set<Object> deserializedCrowdSourcedTypeData = new TreeSet<>();
Set<Object> deserializedCrowdSourcedTypeData = new ConcurrentSkipListSet<>();
crowdSourcedTypeArray.forEach(entry -> deserializedCrowdSourcedTypeData.add(
context.deserialize(entry, crowdSourcedDataType.getDataClass())));

Expand Down

0 comments on commit e580f9c

Please sign in to comment.