/** * Serializes information about a single repository * * @param repository repository metadata * @param builder XContent builder * @param params serialization parameters */ public static void toXContent(RepositoryMetaData repository, XContentBuilder builder, ToXContent.Params params) throws IOException { builder.startObject(repository.name()); builder.field("type", repository.type()); builder.startObject("settings"); repository.settings().toXContent(builder, params); builder.endObject(); builder.endObject(); } }
public RepositoriesMetaData(StreamInput in) throws IOException { RepositoryMetaData[] repository = new RepositoryMetaData[in.readVInt()]; for (int i = 0; i < repository.length; i++) { repository[i] = new RepositoryMetaData(in); } this.repositories = Collections.unmodifiableList(Arrays.asList(repository)); }
/** * {@inheritDoc} */ @Override public void writeTo(StreamOutput out) throws IOException { out.writeVInt(repositories.size()); for (RepositoryMetaData repository : repositories) { repository.writeTo(out); } }
/** * Creates repository holder. This method starts the repository */ private Repository createRepository(RepositoryMetaData repositoryMetaData, Map<String, Repository.Factory> factories) { logger.debug("creating repository [{}][{}]", repositoryMetaData.type(), repositoryMetaData.name()); Repository.Factory factory = factories.get(repositoryMetaData.type()); if (factory == null) { throw new RepositoryException(repositoryMetaData.name(), "repository type [" + repositoryMetaData.type() + "] does not exist"); } try { Repository repository = factory.create(repositoryMetaData, factories::get); repository.start(); return repository; } catch (Exception e) { logger.warn(new ParameterizedMessage("failed to create repository [{}][{}]", repositoryMetaData.type(), repositoryMetaData.name()), e); throw new RepositoryException(repositoryMetaData.name(), "failed to create repository", e); } }
public void registerInternalRepository(String name, String type) { RepositoryMetaData metaData = new RepositoryMetaData(name, type, Settings.EMPTY); Repository repository = internalRepositories.computeIfAbsent(name, (n) -> { logger.debug("put internal repository [{}][{}]", name, type); return createRepository(metaData, internalTypesRegistry); }); if (type.equals(repository.getMetadata().type()) == false) { logger.warn(new ParameterizedMessage("internal repository [{}][{}] already registered. this prevented the registration of " + "internal repository [{}][{}].", name, repository.getMetadata().type(), name, type)); } else if (repositories.containsKey(name)) { logger.warn(new ParameterizedMessage("non-internal repository [{}] already registered. this repository will block the " + "usage of internal repository [{}][{}].", name, metaData.type(), name)); } }
/** * Returns a repository with a given name or null if such repository doesn't exist * * @param name name of repository * @return repository metadata */ public RepositoryMetaData repository(String name) { for (RepositoryMetaData repository : repositories) { if (name.equals(repository.name())) { return repository; } } return null; }
super(metadata, environment.settings(), namedXContentRegistry); this.environment = environment; String location = REPOSITORIES_LOCATION_SETTING.get(metadata.settings()); if (location.isEmpty()) { logger.warn("the repository location is missing, it should point to a shared file system location" + " that is available on all master and data nodes"); throw new RepositoryException(metadata.name(), "missing location"); logger.warn("The specified location [{}] doesn't start with any " + "repository paths specified by the path.repo setting: [{}] ", location, environment.repoFiles()); throw new RepositoryException(metadata.name(), "location [" + location + "] doesn't match any of the locations specified by path.repo"); } else { logger.warn("The specified location [{}] should start with a repository path specified by" + " the path.repo setting, but the path.repo setting was not set on this node", location); throw new RepositoryException(metadata.name(), "location [" + location + "] doesn't match any of the locations specified by path.repo because this setting is empty"); if (CHUNK_SIZE_SETTING.exists(metadata.settings())) { this.chunkSize = CHUNK_SIZE_SETTING.get(metadata.settings()); } else { this.chunkSize = REPOSITORIES_CHUNK_SIZE_SETTING.get(environment.settings()); this.compress = COMPRESS_SETTING.exists(metadata.settings()) ? COMPRESS_SETTING.get(metadata.settings()) : REPOSITORIES_COMPRESS_SETTING.get(environment.settings()); this.basePath = BlobPath.cleanPath();
if (repositories == null) { logger.info("put repository [{}]", request.name); repositories = new RepositoriesMetaData(new RepositoryMetaData(request.name, request.type, request.settings)); } else { boolean found = false; if (repositoryMetaData.name().equals(newRepositoryMetaData.name())) { found = true; repositoriesMetaData.add(newRepositoryMetaData); repositoriesMetaData.add(new RepositoryMetaData(request.name, request.type, request.settings)); } else { logger.info("update repository [{}]", request.name);
logger.info("put repository [{}]", request.name); repositories = new RepositoriesMetaData( Collections.singletonList(new RepositoryMetaData(request.name, request.type, request.settings))); } else { boolean found = false; if (repositoryMetaData.name().equals(newRepositoryMetaData.name())) { if (newRepositoryMetaData.equals(repositoryMetaData)) { repositoriesMetaData.add(new RepositoryMetaData(request.name, request.type, request.settings)); } else { logger.info("update repository [{}]", request.name);
@Override protected BlobStore createBlobStore() throws Exception { final String location = REPOSITORIES_LOCATION_SETTING.get(metadata.settings()); final Path locationFile = environment.resolveRepoFile(location); return new FsBlobStore(environment.settings(), locationFile); }
/** * Creates a new repository and adds it to the list of registered repositories. * <p> * If a repository with the same name but different types or settings already exists, it will be closed and * replaced with the new repository. If a repository with the same name exists but it has the same type and settings * the new repository is ignored. * * @param repositoryMetaData new repository metadata * @return {@code true} if new repository was added or {@code false} if it was ignored */ private boolean registerRepository(RepositoryMetaData repositoryMetaData) throws IOException { Repository previous = repositories.get(repositoryMetaData.name()); if (previous != null) { RepositoryMetaData previousMetadata = previous.getMetadata(); if (previousMetadata.equals(repositoryMetaData)) { // Previous version is the same as this one - ignore it return false; } } Repository newRepo = createRepository(repositoryMetaData); if (previous != null) { closeRepository(previous); } Map<String, Repository> newRepositories = new HashMap<>(repositories); newRepositories.put(repositoryMetaData.name(), newRepo); repositories = newRepositories; return true; }
public void unregisterInternalRepository(String name) { Repository repository = internalRepositories.remove(name); if (repository != null) { RepositoryMetaData metadata = repository.getMetadata(); logger.debug(() -> new ParameterizedMessage("delete internal repository [{}][{}].", metadata.type(), name)); closeRepository(repository); } }
@Override public String toString() { return "BlobStoreRepository[" + "[" + metadata.name() + "], [" + blobStore() + ']' + ']'; }
super(metadata, environment.settings(), namedXContentRegistry); this.environment = environment; String location = REPOSITORIES_LOCATION_SETTING.get(metadata.settings()); if (location.isEmpty()) { logger.warn("the repository location is missing, it should point to a shared file system location" + " that is available on all master and data nodes"); throw new RepositoryException(metadata.name(), "missing location"); logger.warn("The specified location [{}] doesn't start with any " + "repository paths specified by the path.repo setting: [{}] ", location, environment.repoFiles()); throw new RepositoryException(metadata.name(), "location [" + location + "] doesn't match any of the locations specified by path.repo"); } else { logger.warn("The specified location [{}] should start with a repository path specified by" + " the path.repo setting, but the path.repo setting was not set on this node", location); throw new RepositoryException(metadata.name(), "location [" + location + "] doesn't match any of the locations specified by path.repo because this setting is empty"); if (CHUNK_SIZE_SETTING.exists(metadata.settings())) { this.chunkSize = CHUNK_SIZE_SETTING.get(metadata.settings()); } else { this.chunkSize = REPOSITORIES_CHUNK_SIZE_SETTING.get(settings); this.compress = COMPRESS_SETTING.exists(metadata.settings()) ? COMPRESS_SETTING.get(metadata.settings()) : REPOSITORIES_COMPRESS_SETTING.get(settings); this.basePath = BlobPath.cleanPath();
logger.info("put repository [{}]", request.name); repositories = new RepositoriesMetaData( Collections.singletonList(new RepositoryMetaData(request.name, request.type, request.settings))); } else { boolean found = false; if (repositoryMetaData.name().equals(newRepositoryMetaData.name())) { found = true; repositoriesMetaData.add(newRepositoryMetaData); repositoriesMetaData.add(new RepositoryMetaData(request.name, request.type, request.settings)); } else { logger.info("update repository [{}]", request.name);
/** * Constructs new BlobStoreRepository * * @param metadata The metadata for this repository including name and settings * @param settings Settings for the node this repository object is created on */ protected BlobStoreRepository(RepositoryMetaData metadata, Settings settings, NamedXContentRegistry namedXContentRegistry) { super(settings); this.settings = settings; this.metadata = metadata; this.namedXContentRegistry = namedXContentRegistry; snapshotRateLimiter = getRateLimiter(metadata.settings(), "max_snapshot_bytes_per_sec", new ByteSizeValue(40, ByteSizeUnit.MB)); restoreRateLimiter = getRateLimiter(metadata.settings(), "max_restore_bytes_per_sec", new ByteSizeValue(40, ByteSizeUnit.MB)); readOnly = metadata.settings().getAsBoolean("readonly", false); indexShardSnapshotFormat = new ChecksumBlobStoreFormat<>(SNAPSHOT_CODEC, SNAPSHOT_NAME_FORMAT, BlobStoreIndexShardSnapshot::fromXContent, namedXContentRegistry, isCompress()); indexShardSnapshotsFormat = new ChecksumBlobStoreFormat<>(SNAPSHOT_INDEX_CODEC, SNAPSHOT_INDEX_NAME_FORMAT, BlobStoreIndexShardSnapshots::fromXContent, namedXContentRegistry, isCompress()); ByteSizeValue chunkSize = chunkSize(); if (chunkSize != null && chunkSize.getBytes() <= 0) { throw new IllegalArgumentException("the chunk size cannot be negative: [" + chunkSize + "]"); } }
/** * Creates a new repository and adds it to the list of registered repositories. * <p> * If a repository with the same name but different types or settings already exists, it will be closed and * replaced with the new repository. If a repository with the same name exists but it has the same type and settings * the new repository is ignored. * * @param repositoryMetaData new repository metadata * @return {@code true} if new repository was added or {@code false} if it was ignored */ private boolean registerRepository(RepositoryMetaData repositoryMetaData) throws IOException { Repository previous = repositories.get(repositoryMetaData.name()); if (previous != null) { RepositoryMetaData previousMetadata = previous.getMetadata(); if (previousMetadata.equals(repositoryMetaData)) { // Previous version is the same as this one - ignore it return false; } } Repository newRepo = createRepository(repositoryMetaData); if (previous != null) { closeRepository(previous); } Map<String, Repository> newRepositories = new HashMap<>(repositories); newRepositories.put(repositoryMetaData.name(), newRepo); repositories = newRepositories; return true; }
Repository repository = survivors.get(repositoryMetaData.name()); if (repository != null) { if (previousMetadata.type().equals(repositoryMetaData.type()) == false || previousMetadata.settings().equals(repositoryMetaData.settings()) == false) { logger.debug("updating repository [{}]", repositoryMetaData.name()); closeRepository(repository); repository = null; logger.warn(() -> new ParameterizedMessage("failed to change repository [{}]", repositoryMetaData.name()), ex); repository = createRepository(repositoryMetaData, typesRegistry); } catch (RepositoryException ex) { logger.warn(() -> new ParameterizedMessage("failed to create repository [{}]", repositoryMetaData.name()), ex); logger.debug("registering repository [{}]", repositoryMetaData.name()); builder.put(repositoryMetaData.name(), repository);
private Table buildTable(RestRequest req, GetRepositoriesResponse getRepositoriesResponse) { Table table = getTableWithHeader(req); for (RepositoryMetaData repositoryMetaData : getRepositoriesResponse.repositories()) { table.startRow(); table.addCell(repositoryMetaData.name()); table.addCell(repositoryMetaData.type()); table.endRow(); } return table; } }