mirror of
https://github.com/MarginaliaSearch/MarginaliaSearch.git
synced 2025-10-06 17:32:39 +02:00
Compare commits
4 Commits
deploy-022
...
deploy-023
Author | SHA1 | Date | |
---|---|---|---|
|
67ad7a3bbc | ||
|
ed62ec8a35 | ||
|
42b24cfa34 | ||
|
1ffaab2da6 |
@@ -27,10 +27,12 @@ public class DbBrowseDomainsRandom {
|
|||||||
public List<BrowseResult> getRandomDomains(int count, DomainBlacklist blacklist, int set) {
|
public List<BrowseResult> getRandomDomains(int count, DomainBlacklist blacklist, int set) {
|
||||||
|
|
||||||
final String q = """
|
final String q = """
|
||||||
SELECT DOMAIN_ID, DOMAIN_NAME, INDEXED
|
SELECT EC_RANDOM_DOMAINS.DOMAIN_ID, DOMAIN_NAME, INDEXED
|
||||||
FROM EC_RANDOM_DOMAINS
|
FROM EC_RANDOM_DOMAINS
|
||||||
INNER JOIN EC_DOMAIN ON EC_DOMAIN.ID=DOMAIN_ID
|
INNER JOIN EC_DOMAIN ON EC_DOMAIN.ID=DOMAIN_ID
|
||||||
|
LEFT JOIN DOMAIN_AVAILABILITY_INFORMATION DAI ON DAI.DOMAIN_ID=EC_RANDOM_DOMAINS.DOMAIN_ID
|
||||||
WHERE STATE<2
|
WHERE STATE<2
|
||||||
|
AND SERVER_AVAILABLE
|
||||||
AND DOMAIN_SET=?
|
AND DOMAIN_SET=?
|
||||||
AND DOMAIN_ALIAS IS NULL
|
AND DOMAIN_ALIAS IS NULL
|
||||||
ORDER BY RAND()
|
ORDER BY RAND()
|
||||||
|
@@ -7,6 +7,7 @@ import nu.marginalia.ping.svc.HttpPingService;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -85,6 +86,8 @@ public class PingJobScheduler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void pause(int nodeId) {
|
public void pause(int nodeId) {
|
||||||
|
logger.info("Pausing PingJobScheduler for nodeId: {}", nodeId);
|
||||||
|
|
||||||
if (this.nodeId != null && this.nodeId != nodeId) {
|
if (this.nodeId != null && this.nodeId != nodeId) {
|
||||||
logger.warn("Attempted to pause PingJobScheduler with mismatched nodeId: expected {}, got {}", this.nodeId, nodeId);
|
logger.warn("Attempted to pause PingJobScheduler with mismatched nodeId: expected {}, got {}", this.nodeId, nodeId);
|
||||||
return;
|
return;
|
||||||
@@ -98,6 +101,7 @@ public class PingJobScheduler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void resume(int nodeId) {
|
public synchronized void resume(int nodeId) {
|
||||||
|
logger.info("Resuming PingJobScheduler for nodeId: {}", nodeId);
|
||||||
if (this.nodeId != null) {
|
if (this.nodeId != null) {
|
||||||
logger.warn("Attempted to resume PingJobScheduler with mismatched nodeId: expected {}, got {}", this.nodeId, nodeId);
|
logger.warn("Attempted to resume PingJobScheduler with mismatched nodeId: expected {}, got {}", this.nodeId, nodeId);
|
||||||
return;
|
return;
|
||||||
@@ -139,24 +143,14 @@ public class PingJobScheduler {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
List<WritableModel> objects = switch (data) {
|
List<WritableModel> objects = switch (data) {
|
||||||
case HistoricalAvailabilityData.JustDomainReference(DomainReference reference) -> {
|
case HistoricalAvailabilityData.JustDomainReference(DomainReference reference)
|
||||||
logger.info("Processing availability job for domain: {}", reference.domainName());
|
-> httpPingService.pingDomain(reference, null, null);
|
||||||
yield httpPingService.pingDomain(reference, null, null);
|
case HistoricalAvailabilityData.JustAvailability(String domain, DomainAvailabilityRecord record)
|
||||||
}
|
-> httpPingService.pingDomain(
|
||||||
case HistoricalAvailabilityData.JustAvailability(String domain, DomainAvailabilityRecord record) -> {
|
new DomainReference(record.domainId(), record.nodeId(), domain), record, null);
|
||||||
logger.info("Availability check with no security info: {}", domain);
|
case HistoricalAvailabilityData.AvailabilityAndSecurity(String domain, DomainAvailabilityRecord availability, DomainSecurityRecord security)
|
||||||
yield httpPingService.pingDomain(
|
-> httpPingService.pingDomain(
|
||||||
new DomainReference(record.domainId(), record.nodeId(), domain),
|
new DomainReference(availability.domainId(), availability.nodeId(), domain), availability, security);
|
||||||
record,
|
|
||||||
null);
|
|
||||||
}
|
|
||||||
case HistoricalAvailabilityData.AvailabilityAndSecurity(String domain, DomainAvailabilityRecord availability, DomainSecurityRecord security) -> {
|
|
||||||
logger.info("Availability check with full historical data: {}", domain);
|
|
||||||
yield httpPingService.pingDomain(
|
|
||||||
new DomainReference(availability.domainId(), availability.nodeId(), domain),
|
|
||||||
availability,
|
|
||||||
security);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
pingDao.write(objects);
|
pingDao.write(objects);
|
||||||
@@ -201,8 +195,8 @@ public class PingJobScheduler {
|
|||||||
yield dnsPingService.pingDomain(oldRecord.rootDomainName(), oldRecord);
|
yield dnsPingService.pingDomain(oldRecord.rootDomainName(), oldRecord);
|
||||||
}
|
}
|
||||||
case RootDomainReference.ByName(String name) -> {
|
case RootDomainReference.ByName(String name) -> {
|
||||||
var oldRecord = pingDao.getDomainDnsRecord(name);
|
@Nullable var oldRecord = pingDao.getDomainDnsRecord(name);
|
||||||
yield dnsPingService.pingDomain(oldRecord.rootDomainName(), oldRecord);
|
yield dnsPingService.pingDomain(name, oldRecord);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -83,7 +83,7 @@ public class PingHttpFetcher {
|
|||||||
} catch (SocketTimeoutException ex) {
|
} catch (SocketTimeoutException ex) {
|
||||||
return new TimeoutResponse(ex.getMessage());
|
return new TimeoutResponse(ex.getMessage());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
return new ConnectionError(e.getMessage());
|
return new ConnectionError(e.getClass().getSimpleName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -48,7 +48,6 @@ public class DnsPingService {
|
|||||||
switch (changes) {
|
switch (changes) {
|
||||||
case DnsRecordChange.None _ -> {}
|
case DnsRecordChange.None _ -> {}
|
||||||
case DnsRecordChange.Changed changed -> {
|
case DnsRecordChange.Changed changed -> {
|
||||||
logger.info("DNS record for {} changed: {}", newRecord.dnsRootDomainId(), changed);
|
|
||||||
generatedRecords.add(DomainDnsEvent.builder()
|
generatedRecords.add(DomainDnsEvent.builder()
|
||||||
.rootDomainId(newRecord.dnsRootDomainId())
|
.rootDomainId(newRecord.dnsRootDomainId())
|
||||||
.nodeId(newRecord.nodeAffinity())
|
.nodeId(newRecord.nodeAffinity())
|
||||||
|
@@ -18,6 +18,7 @@ import java.net.InetAddress;
|
|||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.time.Duration;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -75,8 +76,8 @@ public class HttpPingService {
|
|||||||
|
|
||||||
result = pingHttpFetcher.fetchUrl(url, Method.HEAD, null, null);
|
result = pingHttpFetcher.fetchUrl(url, Method.HEAD, null, null);
|
||||||
|
|
||||||
if (result instanceof HttpsResponse response && response.httpStatus() == 405) {
|
if (result instanceof HttpsResponse response && shouldTryGET(response.httpStatus())) {
|
||||||
// If we get a 405, we try the GET method instead as not all servers support HEAD requests
|
sleep(Duration.ofSeconds(2));
|
||||||
result = pingHttpFetcher.fetchUrl(url, Method.GET, null, null);
|
result = pingHttpFetcher.fetchUrl(url, Method.GET, null, null);
|
||||||
}
|
}
|
||||||
else if (result instanceof ConnectionError) {
|
else if (result instanceof ConnectionError) {
|
||||||
@@ -84,8 +85,8 @@ public class HttpPingService {
|
|||||||
if (!(result2 instanceof ConnectionError)) {
|
if (!(result2 instanceof ConnectionError)) {
|
||||||
result = result2;
|
result = result2;
|
||||||
}
|
}
|
||||||
if (result instanceof HttpResponse response && response.httpStatus() == 405) {
|
if (result instanceof HttpResponse response && shouldTryGET(response.httpStatus())) {
|
||||||
// If we get a 405, we try the GET method instead as not all servers support HEAD requests
|
sleep(Duration.ofSeconds(2));
|
||||||
result = pingHttpFetcher.fetchUrl(alternateUrl, Method.GET, null, null);
|
result = pingHttpFetcher.fetchUrl(alternateUrl, Method.GET, null, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -116,7 +117,7 @@ public class HttpPingService {
|
|||||||
domainReference.nodeId(),
|
domainReference.nodeId(),
|
||||||
oldPingStatus,
|
oldPingStatus,
|
||||||
ErrorClassification.CONNECTION_ERROR,
|
ErrorClassification.CONNECTION_ERROR,
|
||||||
null);
|
rsp.errorMessage());
|
||||||
newSecurityInformation = null;
|
newSecurityInformation = null;
|
||||||
}
|
}
|
||||||
case TimeoutResponse rsp -> {
|
case TimeoutResponse rsp -> {
|
||||||
@@ -190,6 +191,29 @@ public class HttpPingService {
|
|||||||
return generatedRecords;
|
return generatedRecords;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean shouldTryGET(int statusCode) {
|
||||||
|
if (statusCode < 400) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (statusCode == 429) { // Too many requests, we should not retry with GET
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For all other status codes, we can try a GET request, as many severs do not
|
||||||
|
// cope with HEAD requests properly.
|
||||||
|
|
||||||
|
return statusCode < 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sleep(Duration duration) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(duration.toMillis());
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt(); // Restore the interrupted status
|
||||||
|
logger.warn("Sleep interrupted", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void comparePingStatuses(List<WritableModel> generatedRecords,
|
private void comparePingStatuses(List<WritableModel> generatedRecords,
|
||||||
DomainAvailabilityRecord oldPingStatus,
|
DomainAvailabilityRecord oldPingStatus,
|
||||||
DomainAvailabilityRecord newPingStatus) {
|
DomainAvailabilityRecord newPingStatus) {
|
||||||
|
Reference in New Issue
Block a user