in server/src/main/java/org/apache/cassandra/sidecar/restore/RingTopologyRefresher.java [348:382]
boolean unregister(RestoreJob restoreJob)
{
boolean containsJob = allJobs.remove(restoreJob.jobId);
if (containsJob) // enter this block only once per jobId
{
Set<UUID> jobIdsByKeyspace = jobsByKeyspace.get(restoreJob.keyspaceName);
if (jobIdsByKeyspace == null
|| jobIdsByKeyspace.isEmpty()
|| !jobIdsByKeyspace.remove(restoreJob.jobId))
{
LOGGER.warn("Unable to find the restore job id to unregister. jobId={}", restoreJob.jobId);
return true;
}
if (!jobIdsByKeyspace.isEmpty())
{
// do not remove mapping if there are still jobs of the keyspace
return false;
}
// Multiple threads could reach here and run the following code to remove entries from maps
// The removal is idempotent. It is fine to run the code multiple times.
LOGGER.info("All jobs of the keyspace are unregistered. keyspace={}", restoreJob.keyspaceName);
jobsByKeyspace.remove(restoreJob.keyspaceName);
mapping.remove(restoreJob.keyspaceName);
Promise<?> p = promises.remove(restoreJob.keyspaceName);
if (p != null)
{
// try to finish the promise, if not yet.
p.tryFail("Unable to retrieve topology for restoreJob. " +
"jobId=" + restoreJob.jobId + " keyspace=" + restoreJob.keyspaceName);
}
}
return true;
}