public ServerTorrentsDirectorySeeder()

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;
        }
      }
    });
  }