package the8472.mldht.cli.commands;
import the8472.mldht.cli.CommandProcessor;
import lbms.plugins.mldht.kad.DHT;
import lbms.plugins.mldht.kad.Key;
import lbms.plugins.mldht.kad.tasks.NodeLookup;
import lbms.plugins.mldht.kad.tasks.Task;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadLocalRandom;
public class Burst extends CommandProcessor {
@Override
protected void process() {
Thread t = new Thread(() -> {
int count = 50;
if(arguments.size() > 0)
count = Integer.parseInt(arguments.get(0));
List<DHT> dhts = new ArrayList<>(this.dhts);
List<CompletableFuture<Void>> futures = new ArrayList<>();
List<NodeLookup> tasks = new ArrayList<>(count);
for(int i=0;i<count;i++) {
CompletableFuture<Void> future = new CompletableFuture<>();
futures.add(future);
DHT dht = dhts.get(ThreadLocalRandom.current().nextInt(dhts.size()));
Optional.ofNullable(dht.getServerManager().getRandomActiveServer(false)).ifPresent(rpc -> {
NodeLookup task = new NodeLookup(Key.createRandomKey(), rpc, dht.getNode(), false);
tasks.add(task);
task.addListener((finishedTask) -> {
if(!isRunning()) {
tasks.stream().filter(remaining -> !remaining.isFinished()).forEach(Task::kill);
}
println("done: "+finishedTask+" ["+dht.getType()+"]");
future.complete(null);
});
dht.getTaskManager().addTask(task);
});
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
println("all done");
exit(0);
});
t.setDaemon(true);
t.setName("burst command");
t.start();
}
}