Skip to content

A small tidiness refactor of the GeoIpTaskState's Metadata #110553

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ public void testGeoIpDatabasesDownload() throws Exception {
Set.of("GeoLite2-ASN.mmdb", "GeoLite2-City.mmdb", "GeoLite2-Country.mmdb", "MyCustomGeoLite2-City.mmdb"),
state.getDatabases().keySet()
);
GeoIpTaskState.Metadata metadata = state.get(id);
GeoIpTaskState.Metadata metadata = state.getDatabases().get(id);
int size = metadata.lastChunk() - metadata.firstChunk() + 1;
assertResponse(
prepareSearch(GeoIpDownloader.DATABASES_INDEX).setSize(size)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,23 +170,28 @@ private <T> List<T> fetchDatabasesOverview() throws IOException {
}

// visible for testing
void processDatabase(Map<String, Object> databaseInfo) {
void processDatabase(final Map<String, Object> databaseInfo) {
String name = databaseInfo.get("name").toString().replace(".tgz", "") + ".mmdb";
String md5 = (String) databaseInfo.get("md5_hash");
if (state.contains(name) && Objects.equals(md5, state.get(name).md5())) {
updateTimestamp(name, state.get(name));
return;
}
logger.debug("downloading geoip database [{}]", name);
String url = databaseInfo.get("url").toString();
if (url.startsWith("http") == false) {
// relative url, add it after last slash (i.e. resolve sibling) or at the end if there's no slash after http[s]://
int lastSlash = endpoint.substring(8).lastIndexOf('/');
url = (lastSlash != -1 ? endpoint.substring(0, lastSlash + 8) : endpoint) + "/" + url;
}
processDatabase(name, md5, url);
}

private void processDatabase(final String name, final String md5, final String url) {
Metadata metadata = state.getDatabases().getOrDefault(name, Metadata.EMPTY);
if (Objects.equals(metadata.md5(), md5)) {
updateTimestamp(name, metadata);
return;
}
logger.debug("downloading geoip database [{}]", name);
long start = System.currentTimeMillis();
try (InputStream is = httpClient.get(url)) {
int firstChunk = state.contains(name) ? state.get(name).lastChunk() + 1 : 0;
int firstChunk = metadata.lastChunk() + 1; // if there is no metadata, then Metadata.EMPTY.lastChunk() + 1 = 0
int lastChunk = indexChunks(name, is, firstChunk, md5, start);
if (lastChunk > firstChunk) {
state = state.put(name, new Metadata(start, firstChunk, lastChunk - 1, md5, start));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,6 @@ public Map<String, Metadata> getDatabases() {
return databases;
}

public boolean contains(String name) {
return databases.containsKey(name);
}

public Metadata get(String name) {
return databases.get(name);
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down Expand Up @@ -142,7 +134,13 @@ public void writeTo(StreamOutput out) throws IOException {

record Metadata(long lastUpdate, int firstChunk, int lastChunk, String md5, long lastCheck) implements ToXContentObject {

static final String NAME = GEOIP_DOWNLOADER + "-metadata";
/**
* An empty Metadata object useful for getOrDefault -type calls. Crucially, the 'lastChunk' is -1, so it's safe to use
* with logic that says the new firstChunk is the old lastChunk + 1.
*/
static Metadata EMPTY = new Metadata(-1, -1, -1, "", -1);

private static final String NAME = GEOIP_DOWNLOADER + "-metadata";
private static final ParseField LAST_CHECK = new ParseField("last_check");
private static final ParseField LAST_UPDATE = new ParseField("last_update");
private static final ParseField FIRST_CHUNK = new ParseField("first_chunk");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,8 @@ int indexChunks(String name, InputStream is, int chunk, String expectedMd5, long

@Override
void updateTaskState() {
assertEquals(0, state.get("test.mmdb").firstChunk());
assertEquals(10, state.get("test.mmdb").lastChunk());
assertEquals(0, state.getDatabases().get("test.mmdb").firstChunk());
assertEquals(10, state.getDatabases().get("test.mmdb").lastChunk());
}

@Override
Expand Down Expand Up @@ -341,8 +341,8 @@ int indexChunks(String name, InputStream is, int chunk, String expectedMd5, long

@Override
void updateTaskState() {
assertEquals(9, state.get("test.mmdb").firstChunk());
assertEquals(10, state.get("test.mmdb").lastChunk());
assertEquals(9, state.getDatabases().get("test.mmdb").firstChunk());
assertEquals(10, state.getDatabases().get("test.mmdb").lastChunk());
}

@Override
Expand Down