Removes legacy format in RepositoryData
This commit is contained in:
parent
58d6b9dcd1
commit
0f335ac873
|
@ -58,26 +58,17 @@ public final class RepositoryData implements ToXContent {
|
|||
* The snapshots that each index belongs to.
|
||||
*/
|
||||
private final Map<IndexId, Set<SnapshotId>> indexSnapshots;
|
||||
/**
|
||||
* Whether the repository data is in the legacy (pre 5.0) format
|
||||
*/
|
||||
private final boolean legacyFormat;
|
||||
|
||||
private RepositoryData(List<SnapshotId> snapshotIds, Map<IndexId, Set<SnapshotId>> indexSnapshots, boolean legacyFormat) {
|
||||
public RepositoryData(List<SnapshotId> snapshotIds, Map<IndexId, Set<SnapshotId>> indexSnapshots) {
|
||||
this.snapshotIds = Collections.unmodifiableList(snapshotIds);
|
||||
this.indices = Collections.unmodifiableMap(indexSnapshots.keySet()
|
||||
.stream()
|
||||
.collect(Collectors.toMap(IndexId::getName, Function.identity())));
|
||||
this.indexSnapshots = Collections.unmodifiableMap(indexSnapshots);
|
||||
this.legacyFormat = legacyFormat;
|
||||
}
|
||||
|
||||
public RepositoryData(List<SnapshotId> snapshotIds, Map<IndexId, Set<SnapshotId>> indexSnapshots) {
|
||||
this(snapshotIds, indexSnapshots, false);
|
||||
}
|
||||
|
||||
protected RepositoryData copy() {
|
||||
return new RepositoryData(snapshotIds, indexSnapshots, legacyFormat);
|
||||
return new RepositoryData(snapshotIds, indexSnapshots);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -94,13 +85,6 @@ public final class RepositoryData implements ToXContent {
|
|||
return indices;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the repository data format is in the legacy (pre 5.0) format or not
|
||||
*/
|
||||
public boolean isLegacyFormat() {
|
||||
return legacyFormat;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a snapshot and its indices to the repository; returns a new instance. If the snapshot
|
||||
* already exists in the repository data, this method throws an IllegalArgumentException.
|
||||
|
@ -272,7 +256,7 @@ public final class RepositoryData implements ToXContent {
|
|||
return builder;
|
||||
}
|
||||
|
||||
public static RepositoryData fromXContent(final XContentParser parser, boolean legacyFormat) throws IOException {
|
||||
public static RepositoryData fromXContent(final XContentParser parser) throws IOException {
|
||||
List<SnapshotId> snapshots = new ArrayList<>();
|
||||
Map<IndexId, Set<SnapshotId>> indexSnapshots = new HashMap<>();
|
||||
if (parser.nextToken() == XContentParser.Token.START_OBJECT) {
|
||||
|
@ -321,7 +305,7 @@ public final class RepositoryData implements ToXContent {
|
|||
} else {
|
||||
throw new ElasticsearchParseException("start object expected");
|
||||
}
|
||||
return new RepositoryData(snapshots, indexSnapshots, legacyFormat);
|
||||
return new RepositoryData(snapshots, indexSnapshots);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -344,7 +344,6 @@ public abstract class BlobStoreRepository extends AbstractLifecycleComponent imp
|
|||
// so if the repository data is of the older format, populate it with the indices entries
|
||||
// so we know which indices of snapshots have blob ids in the older format.
|
||||
private RepositoryData upgradeRepositoryData(final RepositoryData repositoryData) throws IOException {
|
||||
assert repositoryData.isLegacyFormat(); // should not be called on non-legacy repositories
|
||||
final Map<IndexId, Set<SnapshotId>> indexToSnapshots = new HashMap<>();
|
||||
for (final SnapshotId snapshotId : repositoryData.getSnapshotIds()) {
|
||||
final SnapshotInfo snapshotInfo;
|
||||
|
@ -689,8 +688,28 @@ public abstract class BlobStoreRepository extends AbstractLifecycleComponent imp
|
|||
@Override
|
||||
public RepositoryData getRepositoryData() {
|
||||
try {
|
||||
RepositoryData repositoryData = readIndexGen();
|
||||
if (repositoryData.isLegacyFormat()) {
|
||||
final long indexGen = latestIndexBlobId();
|
||||
final String snapshotsIndexBlobName;
|
||||
final boolean legacyFormat;
|
||||
if (indexGen == -1) {
|
||||
// index-N file doesn't exist, either its a fresh repository, or its in the
|
||||
// old format, so look for the older index file before returning an empty list
|
||||
snapshotsIndexBlobName = SNAPSHOTS_FILE;
|
||||
legacyFormat = true;
|
||||
} else {
|
||||
snapshotsIndexBlobName = INDEX_FILE_PREFIX + Long.toString(indexGen);
|
||||
legacyFormat = false;
|
||||
}
|
||||
|
||||
RepositoryData repositoryData;
|
||||
try (InputStream blob = snapshotsBlobContainer.readBlob(snapshotsIndexBlobName)) {
|
||||
BytesStreamOutput out = new BytesStreamOutput();
|
||||
Streams.copy(blob, out);
|
||||
try (XContentParser parser = XContentHelper.createParser(out.bytes())) {
|
||||
repositoryData = RepositoryData.fromXContent(parser);
|
||||
}
|
||||
}
|
||||
if (legacyFormat) {
|
||||
// pre 5.0 repository data needs to be updated to include the indices
|
||||
repositoryData = upgradeRepositoryData(repositoryData);
|
||||
}
|
||||
|
@ -755,29 +774,6 @@ public abstract class BlobStoreRepository extends AbstractLifecycleComponent imp
|
|||
writeAtomic(INDEX_LATEST_BLOB, genBytes);
|
||||
}
|
||||
|
||||
RepositoryData readIndexGen() throws IOException {
|
||||
final long indexGen = latestIndexBlobId();
|
||||
final String snapshotsIndexBlobName;
|
||||
final boolean legacyFormat;
|
||||
if (indexGen == -1) {
|
||||
// index-N file doesn't exist, either its a fresh repository, or its in the
|
||||
// old format, so look for the older index file before returning an empty list
|
||||
snapshotsIndexBlobName = SNAPSHOTS_FILE;
|
||||
legacyFormat = true;
|
||||
} else {
|
||||
snapshotsIndexBlobName = INDEX_FILE_PREFIX + Long.toString(indexGen);
|
||||
legacyFormat = false;
|
||||
}
|
||||
|
||||
try (InputStream blob = snapshotsBlobContainer.readBlob(snapshotsIndexBlobName)) {
|
||||
BytesStreamOutput out = new BytesStreamOutput();
|
||||
Streams.copy(blob, out);
|
||||
try (XContentParser parser = XContentHelper.createParser(out.bytes())) {
|
||||
return RepositoryData.fromXContent(parser, legacyFormat);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latest snapshot index blob id. Snapshot index blobs are named index-N, where N is
|
||||
* the next version number from when the index blob was written. Each individual index-N blob is
|
||||
|
|
|
@ -57,7 +57,7 @@ public class RepositoryDataTests extends ESTestCase {
|
|||
XContentBuilder builder = JsonXContent.contentBuilder();
|
||||
repositoryData.toXContent(builder, ToXContent.EMPTY_PARAMS);
|
||||
XContentParser parser = XContentType.JSON.xContent().createParser(builder.bytes());
|
||||
assertEquals(repositoryData, RepositoryData.fromXContent(parser, true));
|
||||
assertEquals(repositoryData, RepositoryData.fromXContent(parser));
|
||||
}
|
||||
|
||||
public void testAddSnapshots() {
|
||||
|
|
Loading…
Reference in New Issue