in server/src/main/java/jetbrains/buildServer/torrent/ServerTorrentsDirectorySeeder.java [56:168]
public ServerTorrentsDirectorySeeder(@NotNull final ServerPaths serverPaths,
@NotNull final ServerSettings serverSettings,
@NotNull final TorrentConfigurator configurator,
@NotNull final EventDispatcher<BuildServerListener> eventDispatcher,
@NotNull final ExecutorServices executorServices,
@NotNull final SelectorFactory selectorFactory,
@NotNull final TrackerClientFactory trackerClientFactory,
@NotNull final ServerResponsibility serverResponsibility) {
setMaxNumberOfSeededTorrents(configurator.getMaxNumberOfSeededTorrents());
myConfigurator = configurator;
mySelectorFactory = selectorFactory;
eventDispatcher.addListener(new BuildServerAdapter() {
@Override
public void serverStartup() {
final File torrentsStorage = new File(serverPaths.getCachesDir(), "torrents");
torrentsStorage.mkdirs();
myTorrentsSeeder = new TorrentsSeeder(torrentsStorage, configurator.getMaxNumberOfSeededTorrents(), new ParentDirConverter() {
@NotNull
@Override
public File getParentDir() {
return serverSettings.getArtifactDirectories().get(0);
}
}, executorServices.getNormalExecutorService(), configurator, trackerClientFactory);
// if torrent file expires, it will be removed from disk as well
// this is needed to prevent agents from downloading this torrent file (because most likely no one is going to seed this torrent in the future)
// and to stop showing torrent icons for users
myTorrentsSeeder.setRemoveExpiredTorrentFiles(serverResponsibility.canManageBuilds());
startSeeder();
}
@Override
public void buildFinished(@NotNull SRunningBuild build) {
if (myTorrentsSeeder == null) {
LOG.warn("Torrent is not initialized at finish of build " +
build + ". Artifacts from this build will not be seeded by server");
return;
}
File artifactsDirectory = build.getArtifactsDirectory();
final File torrentsDir = getTorrentFilesBaseDir(artifactsDirectory);
torrentsDir.mkdirs();
Path torrentsPath = torrentsDir.toPath();
final UnusedTorrentFilesRemover torrentFilesRemover;
boolean readWriteNode = serverResponsibility.canManageBuilds();
if (readWriteNode) {
torrentFilesRemover = new UnusedTorrentFilesRemoverImpl(Files::delete, Files::walkFileTree);
} else {
torrentFilesRemover = (artifacts, path)->{};
}
announceBuildArtifacts(torrentsPath,
build.getArtifacts(BuildArtifactsViewMode.VIEW_INTERNAL_ONLY),
new ArtifactsCollectorImpl(),
new ArtifactProcessorImpl(torrentsPath, artifactsDirectory.toPath(), myTorrentsSeeder, myConfigurator),
torrentFilesRemover);
}
public void serverShutdown() {
if (myTorrentsSeeder != null) {
myTorrentsSeeder.dispose();
}
myConfigurator.stopWatcher();
}
});
configurator.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
String propertyName = evt.getPropertyName();
switch (propertyName) {
case SeedSettings.MAX_NUMBER_OF_SEEDED_TORRENTS:
setMaxNumberOfSeededTorrents((Integer) evt.getNewValue());
myTorrentsSeeder.setMaxTorrentsToSeed(myMaxTorrentsToSeed);
break;
case TorrentConfiguration.ANNOUNCE_INTERVAL:
myTorrentsSeeder.setAnnounceInterval((Integer) evt.getNewValue());
break;
case TorrentConfiguration.MAX_INCOMING_CONNECTIONS:
myTorrentsSeeder.setMaxIncomingConnectionsCount((Integer) evt.getNewValue());
myTorrentsSeeder.setMaxOutgoingConnectionsCount((Integer) evt.getNewValue());
break;
case TorrentConfiguration.SOCKET_CONNECTION_TIMEOUT:
myTorrentsSeeder.setSocketTimeout((Integer) evt.getNewValue());
break;
case TorrentConfiguration.RECEIVE_BUFFER_SIZE:
myTorrentsSeeder.getClient().setReceiveBufferSize((Integer) evt.getNewValue());
break;
case TorrentConfiguration.SEND_BUFFER_SIZE:
myTorrentsSeeder.getClient().setSendBufferSize((Integer) evt.getNewValue());
break;
case TorrentConfiguration.CLEANUP_TIMEOUT:
myTorrentsSeeder.setCleanupTimeout((Integer) evt.getNewValue());
break;
case TorrentConfiguration.ANNOUNCE_URL:
setAnnounceURI(URI.create(String.valueOf(evt.getNewValue())));
break;
case TorrentConfiguration.USER_DOWNLOAD_ENABLED:
case SeedSettings.SEEDING_ENABLED:
boolean enabled = (Boolean) evt.getNewValue();
if (enabled) {
startSeeder();
} else {
stopSeeder();
}
break;
}
}
});
}