Skip to content

Commit 0d6b4ee

Browse files
authored
fix: failing repository upgrade at startup (DSP-654) (#1712)
1 parent 7f95dcc commit 0d6b4ee

File tree

6 files changed

+48
-10
lines changed

6 files changed

+48
-10
lines changed

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,11 @@ init-db-test-minimal: stack-db-remove stack-db-only ## initializes the knora-tes
282282
@echo $@
283283
@$(MAKE) -C webapi/scripts fuseki-init-knora-test-minimal
284284

285+
.PHONY: init-db-test-empty
286+
init-db-test-empty: stack-db-remove stack-db-only ## initializes the knora-test repository with minimal data
287+
@echo $@
288+
@$(MAKE) -C webapi/scripts fuseki-init-knora-test-empty
289+
285290
.PHONY: init-db-test-unit
286291
init-db-test-unit: stack-db-remove stack-db-only ## initializes the knora-test-unit repository
287292
@echo $@

webapi/scripts/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ fuseki-init-knora-test: ## initializes Fuseki with the knora-test repository and
66
fuseki-init-knora-test-minimal: ## initializes Fuseki with the knora-test repository and minimal data
77
./fuseki-init-knora-test-minimal.sh
88

9+
.PHONY: fuseki-init-knora-test-empty
10+
fuseki-init-knora-test-empty: ## initializes Fuseki with the knora-test repository and no data
11+
./fuseki-init-knora-test-empty.sh
12+
913
.PHONY: fuseki-init-knora-test-unit
1014
fuseki-init-knora-test-unit: ## initializes Fuseki with the knora-test-unit repository and no data
1115
./fuseki-init-knora-test-unit.sh
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/usr/bin/env bash
2+
3+
# Including fuseki-funcions.sh implementing delete, create, and upload.
4+
source fuseki-functions.sh
5+
6+
# Name of the repository
7+
REPOSITORY="knora-test"
8+
9+
# delete-repository // delete dos not work correctly. need to delete database manually.
10+
create-repository

webapi/src/main/scala/org/knora/webapi/app/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ scala_binary(
4545
],
4646
main_class = "org.knora.webapi.app.Main",
4747
resources = [
48+
"//knora-ontologies",
49+
"//webapi/scripts:fuseki_repository_config_ttl_template",
4850
"//webapi/src/main/resources",
4951
],
5052
runtime_deps = [

webapi/src/main/scala/org/knora/webapi/store/triplestore/http/HttpTriplestoreConnector.scala

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class HttpTriplestoreConnector extends Actor with ActorLogging with Instrumentat
8686
private val credsProvider: BasicCredentialsProvider = new BasicCredentialsProvider
8787
credsProvider.setCredentials(new AuthScope(targetHost.getHostName, targetHost.getPort), new UsernamePasswordCredentials(settings.triplestoreUsername, settings.triplestorePassword))
8888

89-
// Reading data should be quick.
89+
// Reading data should be quick, except when it is not ;-)
9090
private val queryTimeoutMillis = settings.triplestoreQueryTimeout.toMillis.toInt
9191

9292
private val queryRequestConfig = RequestConfig.custom()
@@ -775,7 +775,7 @@ class HttpTriplestoreConnector extends Actor with ActorLogging with Instrumentat
775775
}
776776

777777
val took = System.currentTimeMillis() - start
778-
log.info(s"[$statusCode] GraphDB Query took: ${took}ms")
778+
log.info(s"[$statusCode] DB Query took: ${took}ms")
779779

780780
Option(maybeResponse.get.getEntity) match {
781781
case Some(responseEntity: HttpEntity) =>
@@ -921,6 +921,20 @@ class HttpTriplestoreConnector extends Actor with ActorLogging with Instrumentat
921921
var maybeResponse: Option[CloseableHttpResponse] = None
922922

923923
try {
924+
925+
val queryTimeoutMillis = settings.triplestoreQueryTimeout.toMillis.toInt * 10
926+
927+
val queryRequestConfig = RequestConfig.custom()
928+
.setConnectTimeout(queryTimeoutMillis)
929+
.setConnectionRequestTimeout(queryTimeoutMillis)
930+
.setSocketTimeout(queryTimeoutMillis)
931+
.build
932+
933+
val queryHttpClient: CloseableHttpClient = HttpClients.custom
934+
.setDefaultCredentialsProvider(credsProvider)
935+
.setDefaultRequestConfig(queryRequestConfig)
936+
.build
937+
924938
maybeResponse = Some(queryHttpClient.execute(targetHost, httpGet, httpContext))
925939

926940
val statusCode: Int = maybeResponse.get.getStatusLine.getStatusCode
@@ -932,7 +946,7 @@ class HttpTriplestoreConnector extends Actor with ActorLogging with Instrumentat
932946
}
933947

934948
val took = System.currentTimeMillis() - start
935-
log.info(s"[$statusCode] GraphDB Query took: ${took}ms")
949+
log.info(s"[$statusCode] DB Query took: ${took}ms")
936950

937951
Option(maybeResponse.get.getEntity) match {
938952
case Some(responseEntity: HttpEntity) =>

webapi/src/main/scala/org/knora/webapi/store/triplestore/upgrade/RepositoryUpdater.scala

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,22 @@ class RepositoryUpdater(system: ActorSystem,
7979
*/
8080
def maybeUpdateRepository: Future[RepositoryUpdatedResponse] = {
8181
for {
82-
maybeRepositoryVersionString <- getRepositoryVersion
82+
foundRepositoryVersion: Option[String] <- getRepositoryVersion
83+
requiredRepositoryVersion = org.knora.webapi.KnoraBaseVersion
8384

8485
// Is the repository up to date?
85-
repositoryUpdatedResponse: RepositoryUpdatedResponse <- if (maybeRepositoryVersionString.contains(org.knora.webapi.KnoraBaseVersion)) {
86+
repositoryUpToData = foundRepositoryVersion.contains(requiredRepositoryVersion)
87+
repositoryUpdatedResponse: RepositoryUpdatedResponse <- if (repositoryUpToData) {
8688
// Yes. Nothing more to do.
87-
FastFuture.successful(RepositoryUpdatedResponse(s"Repository is up to date at ${org.knora.webapi.KnoraBaseVersion}"))
89+
FastFuture.successful(RepositoryUpdatedResponse(s"Repository is up to date at $requiredRepositoryVersion"))
8890
} else {
8991
// No. Construct the list of updates that it needs.
90-
val pluginsForNeededUpdates: Seq[PluginForKnoraBaseVersion] = selectPluginsForNeededUpdates(maybeRepositoryVersionString)
91-
log.info(s"Updating repository with transformations: ${pluginsForNeededUpdates.map(_.versionString).mkString(", ")}")
92+
log.info(s"Repository not up-to-date. Found: $foundRepositoryVersion, Required: $requiredRepositoryVersion")
93+
val selectedPlugins: Seq[PluginForKnoraBaseVersion] = selectPluginsForNeededUpdates(foundRepositoryVersion)
94+
log.info(s"Updating repository with transformations: ${selectedPlugins.map(_.versionString).mkString(", ")}")
9295

9396
// Update it with those plugins.
94-
updateRepository(pluginsForNeededUpdates)
97+
updateRepositoryWithSelectedPlugins(selectedPlugins)
9598
}
9699
} yield repositoryUpdatedResponse
97100
}
@@ -144,7 +147,7 @@ class RepositoryUpdater(system: ActorSystem,
144147
* @param pluginsForNeededUpdates the plugins needed to update the repository.
145148
* @return a [[RepositoryUpdatedResponse]] indicating what was done.
146149
*/
147-
private def updateRepository(pluginsForNeededUpdates: Seq[PluginForKnoraBaseVersion]): Future[RepositoryUpdatedResponse] = {
150+
private def updateRepositoryWithSelectedPlugins(pluginsForNeededUpdates: Seq[PluginForKnoraBaseVersion]): Future[RepositoryUpdatedResponse] = {
148151
// Was a download directory specified in the application settings?
149152
val downloadDir: File = settings.upgradeDownloadDir match {
150153
case Some(configuredDir) =>

0 commit comments

Comments
 (0)