Skip to content
Snippets Groups Projects
Commit 5d0f1035 authored by Benedikt Heinrichs's avatar Benedikt Heinrichs
Browse files

Fix: Retry failed Virtuoso Queries

parent 1b346c8b
No related branches found
No related tags found
No related merge requests found
Pipeline #841110 passed
...@@ -147,7 +147,7 @@ namespace SQL2Linked.Implementations ...@@ -147,7 +147,7 @@ namespace SQL2Linked.Implementations
"}" "}"
}; };
var resultSet = QueryEndpoint.QueryWithResultSet(cmdString.ToString()); var resultSet = WrapRequest(() => RdfStoreConnector.QueryEndpoint.QueryWithResultSet(cmdString.ToString()));
foreach (var result in resultSet) foreach (var result in resultSet)
{ {
...@@ -211,7 +211,7 @@ namespace SQL2Linked.Implementations ...@@ -211,7 +211,7 @@ namespace SQL2Linked.Implementations
"WHERE { @applicationProfile <http://www.w3.org/ns/shacl#targetClass> ?targetClass }" "WHERE { @applicationProfile <http://www.w3.org/ns/shacl#targetClass> ?targetClass }"
}; };
targetClassCmdString.SetUri("applicationProfile", new Uri(entry.ApplicationProfile)); targetClassCmdString.SetUri("applicationProfile", new Uri(entry.ApplicationProfile));
var targetClassResultSet = QueryEndpoint.QueryWithResultSet(targetClassCmdString.ToString()); var targetClassResultSet = WrapRequest(() => RdfStoreConnector.QueryEndpoint.QueryWithResultSet(targetClassCmdString.ToString()));
var targetClass = entry.ApplicationProfile; var targetClass = entry.ApplicationProfile;
foreach (var result in targetClassResultSet) foreach (var result in targetClassResultSet)
......
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Coscine.Database" Version="2.*-*" /> <PackageReference Include="Coscine.Database" Version="2.*-*" />
<PackageReference Include="Coscine.Metadata" Version="2.*-*" /> <PackageReference Include="Coscine.Metadata" Version="2.*-*" />
<PackageReference Include="Polly" Version="7.2.3" />
</ItemGroup> </ItemGroup>
</Project> </Project>
using Coscine.Configuration; using Polly;
using Coscine.Configuration;
using Coscine.Database.Models; using Coscine.Database.Models;
using Coscine.Metadata; using Coscine.Metadata;
using VDS.RDF; using VDS.RDF;
using VDS.RDF.Query;
namespace SQL2Linked namespace SQL2Linked
{ {
...@@ -12,7 +12,6 @@ namespace SQL2Linked ...@@ -12,7 +12,6 @@ namespace SQL2Linked
public ConsulConfiguration Configuration { get; init; } public ConsulConfiguration Configuration { get; init; }
public RdfStoreConnector RdfStoreConnector { get; init; } public RdfStoreConnector RdfStoreConnector { get; init; }
public static string Prefix { get; set; } public static string Prefix { get; set; }
public readonly SparqlRemoteEndpoint QueryEndpoint;
public StructuralData() public StructuralData()
{ {
...@@ -20,7 +19,11 @@ namespace SQL2Linked ...@@ -20,7 +19,11 @@ namespace SQL2Linked
RdfStoreConnector = new RdfStoreConnector(Configuration.GetStringAndWait("coscine/local/virtuoso/additional/url")); RdfStoreConnector = new RdfStoreConnector(Configuration.GetStringAndWait("coscine/local/virtuoso/additional/url"));
Model = new T(); Model = new T();
Prefix = Configuration.GetStringAndWait("coscine/global/epic/prefix"); Prefix = Configuration.GetStringAndWait("coscine/global/epic/prefix");
QueryEndpoint = new SparqlRemoteEndpoint(new Uri(Configuration.GetStringAndWait("coscine/local/virtuoso/additional/url"))); // 100 second timeout
var timeout = 100000;
RdfStoreConnector.QueryEndpoint.Timeout = timeout;
RdfStoreConnector.UpdateEndpoint.Timeout = timeout;
RdfStoreConnector.ReadWriteSparqlConnector.Timeout = timeout;
} }
public abstract IEnumerable<IGraph> ConvertToLinkedData(IEnumerable<S> entries); public abstract IEnumerable<IGraph> ConvertToLinkedData(IEnumerable<S> entries);
...@@ -46,17 +49,17 @@ namespace SQL2Linked ...@@ -46,17 +49,17 @@ namespace SQL2Linked
foreach (var graph in graphs) foreach (var graph in graphs)
{ {
Console.WriteLine($" ({graph.BaseUri})"); Console.WriteLine($" ({graph.BaseUri})");
var exists = RdfStoreConnector.HasGraph(graph.BaseUri); var exists = WrapRequest(() => RdfStoreConnector.HasGraph(graph.BaseUri));
if (exists) if (exists)
{ {
Console.WriteLine($" - Graph {graph.BaseUri} exists"); Console.WriteLine($" - Graph {graph.BaseUri} exists");
// Clear the existing graph from the store // Clear the existing graph from the store
RdfStoreConnector.ClearGraph(graph.BaseUri); WrapRequest(() => RdfStoreConnector.ClearGraph(graph.BaseUri));
Console.WriteLine($" - Cleared Graph {graph.BaseUri}"); Console.WriteLine($" - Cleared Graph {graph.BaseUri}");
} }
// Add the new graph to the store // Add the new graph to the store
RdfStoreConnector.AddGraph(graph); WrapRequest(() => RdfStoreConnector.AddGraph(graph));
Console.WriteLine($" - Graph {graph.BaseUri} added successfully"); Console.WriteLine($" - Graph {graph.BaseUri} added successfully");
Console.WriteLine(); Console.WriteLine();
} }
...@@ -103,5 +106,33 @@ namespace SQL2Linked ...@@ -103,5 +106,33 @@ namespace SQL2Linked
); );
} }
} }
/// <summary>
/// Retry Virtuoso Requests since they sometimes just fail
/// </summary>
/// <typeparam name="W"></typeparam>
/// <param name="function"></param>
/// <returns></returns>
public void WrapRequest(Action action)
{
Policy
.Handle<Exception>()
.WaitAndRetry(5, retryNumber => TimeSpan.FromMilliseconds(200))
.Execute(() => action.Invoke());
}
/// <summary>
/// Retry Virtuoso Requests since they sometimes just fail
/// </summary>
/// <typeparam name="W"></typeparam>
/// <param name="function"></param>
/// <returns></returns>
public W WrapRequest<W>(Func<W> function)
{
return Policy
.Handle<Exception>()
.WaitAndRetry(5, retryNumber => TimeSpan.FromMilliseconds(200))
.ExecuteAndCapture(() => function.Invoke()).Result;
}
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment