dosubot[bot] commented on issue #2634:
URL:
https://github.com/apache/incubator-hugegraph/issues/2634#issuecomment-2287765404
<!-- Answer -->
Yes, it is possible for another thread to make modifications in the
`getPartitionById` method after the `waitGraphLock` method is called, because
`waitGraphLock` only waits until the lock is released and does not hold the
lock itself.
To ensure thread safety in this scenario, you should use the `lockGraph`
method to acquire the lock before performing the get query and then release the
lock using the `unlockGraph` method after the query is done. Here is how you
can modify the `getPartitionById` method to ensure thread safety:
```java
public KVPair<Metapb.Partition, Metapb.Shard> getPartitionById(String
graphName, int partId) {
try {
lockGraph(graphName); // Acquire the lock
GraphCache graph = initGraph(graphName);
Partition partition = graph.getPartition(partId);
if (partition == null) {
return null;
}
KVPair<ShardGroup, Shard> group = groups.get(partId);
if (group == null) {
return null;
}
Shard shard = group.getValue();
if (shard == null) {
return null;
}
return new KVPair<>(partition, shard);
} finally {
unlockGraph(graphName); // Release the lock
}
}
```
By acquiring the lock before accessing the `partitionCache` and releasing it
afterward, you ensure that no other thread can modify the cache while the
current thread is performing the get query. This approach leverages the
`ReentrantReadWriteLock` from the `GraphCache` class to manage concurrent
access to the partitions, ensuring thread safety
<sup>[[1]](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-pd/hg-pd-common/src/main/java/org/apache/hugegraph/pd/common/PartitionCache.java)</sup><sup>[[2]](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-pd/hg-pd-common/src/main/java/org/apache/hugegraph/pd/common/GraphCache.java)</sup><sup>[[3]](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-pd/hg-pd-client/src/main/java/org/apache/hugegraph/pd/client/ClientCache.java)</sup>.
<!-- Dosu Comment Footer -->
*To continue talking to [Dosu](https://dosu.dev), mention @dosu.*
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]