Commit c19be5b3 authored by Karsten Loesing's avatar Karsten Loesing
Browse files

Fix synchronizing bandwidth files from other CollecTors.

Fixes #30525.
parent e5c75cf4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@
  <property name="release.version" value="1.9.0-dev" />
  <property name="project-main-class" value="org.torproject.metrics.collector.Main" />
  <property name="name" value="collector"/>
  <property name="metricslibversion" value="2.6.1" />
  <property name="metricslibversion" value="2.6.2" />
  <property name="jarincludes" value="collector.properties logback.xml" />

  <patternset id="runtime" >
+65 −0
Original line number Diff line number Diff line
/* Copyright 2016--2018 The Tor Project
 * See LICENSE for licensing information */

package org.torproject.metrics.collector.persist;

import org.torproject.descriptor.BandwidthFile;
import org.torproject.metrics.collector.conf.Annotation;

import org.apache.commons.codec.digest.DigestUtils;

import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class BandwidthFilePersistence
    extends DescriptorPersistence<BandwidthFile> {

  private static final String BANDWIDTH = "bandwidth";
  private static final String BANDWIDTHS = "bandwidths";

  public BandwidthFilePersistence(BandwidthFile desc) {
    super(desc, Annotation.BandwidthFile.bytes());
    calculatePaths();
  }

  private void calculatePaths() {
    LocalDateTime fileCreatedOrTimestamp = this.desc.fileCreated()
        .orElse(this.desc.timestamp());
    DateTimeFormatter directoriesFormatter = DateTimeFormatter
        .ofPattern("uuuu/MM/dd").withZone(ZoneOffset.UTC);
    String[] directories = fileCreatedOrTimestamp.format(directoriesFormatter)
        .split("/");
    DateTimeFormatter fileFormatter = DateTimeFormatter
        .ofPattern("uuuu-MM-dd-HH-mm-ss").withZone(ZoneOffset.UTC);
    String bandwidthFileDigest = calcDigestFromBytes(
        this.desc.getRawDescriptorBytes());
    String fileOut = fileCreatedOrTimestamp.format(fileFormatter)
        + "-bandwidth-" + bandwidthFileDigest;
    this.recentPath = Paths.get(RELAYDESCS, BANDWIDTHS, fileOut).toString();
    this.storagePath = Paths.get(RELAYDESCS, BANDWIDTH, directories[0],
        directories[1], directories[2], fileOut).toString();
  }

  /** Calculate a digest for bandwidth files. */
  private static String calcDigestFromBytes(byte[] bytes) {
    String digest = "";
    int start = 0;
    while (start < bytes.length && bytes[start] == (byte) '@') {
      do {
        start++;
      } while (start < bytes.length && bytes[start] != (byte) '\n');
      start++;
    }
    if (start < bytes.length) {
      byte[] forDigest = new byte[bytes.length - start];
      System.arraycopy(bytes, start, forDigest, 0, forDigest.length);
      digest = DigestUtils.sha256Hex(forDigest).toUpperCase();
    } else {
      log.error("No digest calculation possible.  Returning empty string.");
    }
    return digest;
  }
}
+5 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@

package org.torproject.metrics.collector.sync;

import org.torproject.descriptor.BandwidthFile;
import org.torproject.descriptor.BridgeExtraInfoDescriptor;
import org.torproject.descriptor.BridgeNetworkStatus;
import org.torproject.descriptor.BridgeServerDescriptor;
@@ -17,6 +18,7 @@ import org.torproject.descriptor.WebServerAccessLog;
import org.torproject.metrics.collector.conf.Configuration;
import org.torproject.metrics.collector.conf.ConfigurationException;
import org.torproject.metrics.collector.conf.Key;
import org.torproject.metrics.collector.persist.BandwidthFilePersistence;
import org.torproject.metrics.collector.persist.BridgeExtraInfoPersistence;
import org.torproject.metrics.collector.persist.BridgeServerDescriptorPersistence;
import org.torproject.metrics.collector.persist.ConsensusPersistence;
@@ -138,6 +140,9 @@ public class SyncPersistence {
          descPersist = new WebServerAccessLogPersistence(
              (WebServerAccessLog) desc);
          break;
        case "BandwidthFile":
          descPersist = new BandwidthFilePersistence((BandwidthFile) desc);
          break;
        default:
          log.trace("Invalid descriptor type {} for sync-merge.",
              clazz.getName());