io.bdeploy.bhive.cli.DiscUsageTool Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of api Show documentation
Show all versions of api Show documentation
Public API including dependencies, ready to be used for integrations and plugins.
package io.bdeploy.bhive.cli;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.concurrent.atomic.LongAdder;
import io.bdeploy.bhive.BHive;
import io.bdeploy.bhive.cli.DiscUsageTool.DiscUsageConfig;
import io.bdeploy.bhive.model.Manifest;
import io.bdeploy.bhive.model.ObjectId;
import io.bdeploy.bhive.op.ManifestListOperation;
import io.bdeploy.bhive.op.ObjectListOperation;
import io.bdeploy.bhive.op.ObjectSizeOperation;
import io.bdeploy.common.ActivityReporter;
import io.bdeploy.common.ActivityReporter.Activity;
import io.bdeploy.common.cfg.Configuration.EnvironmentFallback;
import io.bdeploy.common.cfg.Configuration.Help;
import io.bdeploy.common.cfg.Configuration.Validator;
import io.bdeploy.common.cfg.ExistingPathValidator;
import io.bdeploy.common.cfg.PathOwnershipValidator;
import io.bdeploy.common.cli.ToolBase.CliTool.CliName;
import io.bdeploy.common.cli.ToolBase.ConfiguredCliTool;
import io.bdeploy.common.cli.ToolCategory;
import io.bdeploy.common.cli.ToolDefaultVerbose;
import io.bdeploy.common.cli.data.DataTable;
import io.bdeploy.common.cli.data.DataTableColumn;
import io.bdeploy.common.cli.data.RenderableResult;
import io.bdeploy.common.util.FormatHelper;
/**
* A tool to check disc usage for one or more given manifests.
*/
@Help("Calculate disc usage for given Manifest(s).")
@ToolCategory(BHiveCli.MAINTENANCE_TOOLS)
@CliName("du")
@ToolDefaultVerbose(true)
public class DiscUsageTool extends ConfiguredCliTool {
public @interface DiscUsageConfig {
@Help("The local BHive")
@EnvironmentFallback("BHIVE")
@Validator({ ExistingPathValidator.class, PathOwnershipValidator.class })
String hive();
@Help("Manifest(s) to inspect. May appear multiple times. Format is 'name:tag'. If not present, all manifests are calculated.")
String[] manifest() default {};
@Help("Manifest name prefix. All manifests matching this prefix will be calculated.")
String manifestPrefix();
}
public DiscUsageTool() {
super(DiscUsageConfig.class);
}
@Override
protected RenderableResult run(DiscUsageConfig config) {
helpAndFailIfMissing(config.hive(), "Missing --hive");
if (config.manifestPrefix() != null && config.manifest().length != 0) {
helpAndFail("Pass either prefix or manifests, not both");
}
Path path = Paths.get(config.hive());
DataTable result = createDataTable();
result.setCaption("Disc Usage");
result.column(new DataTableColumn.Builder("Manifest Name").setMinWidth(15).build());
result.column(new DataTableColumn.Builder("Tag").setMinWidth(15).build());
result.column(new DataTableColumn.Builder("Size").setMinWidth(10).build());
result.column(new DataTableColumn.Builder("# Obj").setMinWidth(7).build());
result.column(new DataTableColumn.Builder("# Ref").setMinWidth(5).build());
result.addFooter(
"Note that objects may be calculated multiple times. The actual disc usage sum may be much lower than the sum of manifest size.");
try (BHive hive = new BHive(path.toUri(), getAuditorFactory().apply(path), new ActivityReporter.Null())) {
SortedSet keys = new TreeSet<>();
if (config.manifestPrefix() != null) {
keys.addAll(hive.execute(new ManifestListOperation().setManifestName(config.manifestPrefix()))); // only with prefix
} else if (config.manifest().length > 0) {
for (String k : config.manifest()) {
keys.add(Manifest.Key.parse(k));
}
} else {
keys.addAll(hive.execute(new ManifestListOperation())); // all
}
try (Activity calculating = getActivityReporter().start("Calculate Disc Usage", keys.size())) {
for (Manifest.Key k : keys) {
calculateUsage(hive, k, result);
calculating.worked(1);
}
}
}
return result;
}
private static void calculateUsage(BHive hive, Manifest.Key key, DataTable result) {
LongAdder refs = new LongAdder();
// find all objects.
Set objects = hive.execute(new ObjectListOperation().addManifest(key));
// calculate sizes.
Long size = hive.execute(new ObjectSizeOperation().addObject(objects));
result.row().cell(key.getName()).cell(key.getTag()).cell(FormatHelper.formatFileSize(size)).cell(objects.size())
.cell(refs.sum()).build();
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy