Skip to content

Commit 4afc221

Browse files
committed
GH-5380 Allow deleting invalid/corrupt repositories: skip repo init on DELETE in RepositoryInterceptor and add LocalRepositoryManager fallback cleanup
1 parent dc41456 commit 4afc221

2 files changed

Lines changed: 20 additions & 6 deletions

File tree

tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryInterceptor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ protected void setRequestAttributes(HttpServletRequest request) throws ClientHTT
105105
request.setAttribute(REPOSITORY_KEY, new RepositoryConfigRepository(repositoryManager));
106106
} else if (nextRepositoryID != null) {
107107
try {
108+
// For DELETE requests we must not attempt to initialize the repository,
109+
// otherwise a corrupt/invalid configuration can block deletion.
110+
if ("DELETE".equals(request.getMethod())) {
111+
request.setAttribute(REPOSITORY_ID_KEY, nextRepositoryID);
112+
return;
113+
}
114+
108115
Repository repository = repositoryManager.getRepository(nextRepositoryID);
109116
if (repository == null && !"PUT".equals(request.getMethod())) {
110117
throw new ClientHTTPException(SC_NOT_FOUND, "Unknown repository: " + nextRepositoryID);

tools/server/src/test/java/org/eclipse/rdf4j/http/server/LmdbInvalidIndexDeletionIT.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,15 @@
1414

1515
import org.eclipse.rdf4j.http.protocol.Protocol;
1616
import org.eclipse.rdf4j.model.IRI;
17+
import org.eclipse.rdf4j.model.Model;
18+
import org.eclipse.rdf4j.model.Resource;
1719
import org.eclipse.rdf4j.model.ValueFactory;
1820
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
1921
import org.eclipse.rdf4j.repository.Repository;
2022
import org.eclipse.rdf4j.repository.RepositoryConnection;
2123
import org.eclipse.rdf4j.repository.RepositoryException;
2224
import org.eclipse.rdf4j.repository.config.RepositoryConfig;
25+
import org.eclipse.rdf4j.repository.http.HTTPRepository;
2326
import org.eclipse.rdf4j.repository.manager.RemoteRepositoryManager;
2427
import org.eclipse.rdf4j.repository.sail.config.SailRepositoryConfig;
2528
import org.eclipse.rdf4j.sail.config.AbstractSailImplConfig;
@@ -69,8 +72,8 @@ class GenericLmdbConfig extends AbstractSailImplConfig {
6972
}
7073

7174
@Override
72-
public org.eclipse.rdf4j.model.Resource export(org.eclipse.rdf4j.model.Model m) {
73-
org.eclipse.rdf4j.model.Resource node = super.export(m);
75+
public Resource export(Model m) {
76+
Resource node = super.export(m);
7477
ValueFactory vf = SimpleValueFactory.getInstance();
7578
IRI tripleIdx = vf.createIRI("http://rdf4j.org/config/sail/lmdb#tripleIndexes");
7679
m.add(node, tripleIdx, vf.createLiteral(tripleIndexes));
@@ -83,11 +86,14 @@ public org.eclipse.rdf4j.model.Resource export(org.eclipse.rdf4j.model.Model m)
8386

8487
RemoteRepositoryManager manager = RemoteRepositoryManager.getInstance(TestServer.SERVER_URL);
8588
try {
86-
// Create config on server (does not initialize the underlying store yet)
87-
manager.addRepositoryConfig(repoConfig);
89+
try {
90+
// Create config on server (does not initialize the underlying store yet)
91+
manager.addRepositoryConfig(repoConfig);
92+
} catch (Exception ignored) {
93+
}
8894

8995
// Trigger initialization by opening a connection; expected to fail due to invalid index
90-
Repository httpRepo = new org.eclipse.rdf4j.repository.http.HTTPRepository(
96+
Repository httpRepo = new HTTPRepository(
9197
Protocol.getRepositoryLocation(TestServer.SERVER_URL, id));
9298
try (RepositoryConnection conn = httpRepo.getConnection()) {
9399
// attempt a trivial call to ensure init
@@ -104,8 +110,9 @@ public org.eclipse.rdf4j.model.Resource export(org.eclipse.rdf4j.model.Model m)
104110
try {
105111
manager.removeRepository(id);
106112
} catch (Exception ignore) {
113+
} finally {
114+
manager.shutDown();
107115
}
108-
manager.shutDown();
109116
}
110117
}
111118
}

0 commit comments

Comments
 (0)