Skip to content
Snippets Groups Projects
Commit 6476eb98 authored by Michele Chiari's avatar Michele Chiari
Browse files

Add timeout.

parent 254e8ffa
No related branches found
No related tags found
No related merge requests found
...@@ -142,9 +142,10 @@ class IntermediateModelChecker: ...@@ -142,9 +142,10 @@ class IntermediateModelChecker:
self.intermediate_model = intermediate_model self.intermediate_model = intermediate_model
instantiate_solver() instantiate_solver()
def check_requirements(self, reqs: RequirementStore) -> MCResults: def check_requirements(self, reqs: RequirementStore, timeout: int = 0) -> MCResults:
results = [] self.solver.set(timeout=(timeout * 1000))
results = []
for req in reqs.get_all_requirements(): for req in reqs.get_all_requirements():
self.solver.push() self.solver.push()
self.solver.assert_and_track( self.solver.assert_and_track(
......
...@@ -2,6 +2,7 @@ from typing import Optional ...@@ -2,6 +2,7 @@ from typing import Optional
import importlib.resources as ilres import importlib.resources as ilres
import yaml import yaml
from joblib import parallel_backend, Parallel, delayed from joblib import parallel_backend, Parallel, delayed
from multiprocessing import TimeoutError
from .. import assets from .. import assets
from .intermediate_model.doml_element import ( from .intermediate_model.doml_element import (
...@@ -14,7 +15,7 @@ from .intermediate_model.metamodel import ( ...@@ -14,7 +15,7 @@ from .intermediate_model.metamodel import (
parse_metamodel parse_metamodel
) )
from .xmi_parser.doml_model import parse_doml_model from .xmi_parser.doml_model import parse_doml_model
from .mc_result import MCResults from .mc_result import MCResult, MCResults
from .imc import RequirementStore, IntermediateModelChecker from .imc import RequirementStore, IntermediateModelChecker
from .common_reqs import CommonRequirements from .common_reqs import CommonRequirements
from .consistency_reqs import ( from .consistency_reqs import (
...@@ -41,7 +42,7 @@ class ModelChecker: ...@@ -41,7 +42,7 @@ class ModelChecker:
self.intermediate_model: IntermediateModel = parse_doml_model(xmi_model, ModelChecker.metamodel) self.intermediate_model: IntermediateModel = parse_doml_model(xmi_model, ModelChecker.metamodel)
reciprocate_inverse_associations(self.intermediate_model, ModelChecker.inv_assoc) reciprocate_inverse_associations(self.intermediate_model, ModelChecker.inv_assoc)
def check_common_requirements(self, threads=1, consistency_checks=False) -> MCResults: def check_common_requirements(self, threads: int = 1, consistency_checks: bool = False, timeout: Optional[int] = None) -> MCResults:
assert ModelChecker.metamodel and ModelChecker.inv_assoc assert ModelChecker.metamodel and ModelChecker.inv_assoc
req_store = CommonRequirements req_store = CommonRequirements
if consistency_checks: if consistency_checks:
...@@ -59,7 +60,7 @@ class ModelChecker: ...@@ -59,7 +60,7 @@ class ModelChecker:
if threads <= 1: if threads <= 1:
imc = IntermediateModelChecker(ModelChecker.metamodel, ModelChecker.inv_assoc, self.intermediate_model) imc = IntermediateModelChecker(ModelChecker.metamodel, ModelChecker.inv_assoc, self.intermediate_model)
reqs = imc.check_requirements(req_store) reqs = imc.check_requirements(req_store, timeout=(0 if timeout is None else timeout))
return reqs return reqs
else: else:
def split_reqs(n_reqs: int, n_split: int): def split_reqs(n_reqs: int, n_split: int):
...@@ -70,9 +71,12 @@ class ModelChecker: ...@@ -70,9 +71,12 @@ class ModelChecker:
rto = min(rfrom + slice_size, n_reqs) rto = min(rfrom + slice_size, n_reqs)
yield rfrom, rto yield rfrom, rto
try:
with parallel_backend('threading', n_jobs=threads): with parallel_backend('threading', n_jobs=threads):
results = Parallel()(delayed(worker)(rfrom, rto) for rfrom, rto in split_reqs(len(req_store), threads)) results = Parallel(timeout=timeout)(delayed(worker)(rfrom, rto) for rfrom, rto in split_reqs(len(req_store), threads))
ret = MCResults([]) ret = MCResults([])
for res in results: for res in results:
ret.add_results(res) ret.add_results(res)
return ret return ret
except TimeoutError:
return MCResults([(MCResult.dontknow, "")])
...@@ -25,7 +25,7 @@ class MCResult(Enum): ...@@ -25,7 +25,7 @@ class MCResult(Enum):
class MCResults: class MCResults:
dontknow_msg = "Unable to check some requirements." dontknow_msg = "Timed out: unable to check some requirements."
def __init__(self, results: list[tuple[MCResult, str]]): def __init__(self, results: list[tuple[MCResult, str]]):
self.results = results self.results = results
......
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
import mc_openapi.doml_mc as mc import mc_openapi.doml_mc as mc
doml_document_path = "../../tests/doml/nginx-openstack_v2.domlx" doml_document_path = "../../tests/doml/nginx-openstack_v2.domlx"
# doml_document_path = "../../tests/doml/nginx-openstack_v2_wrong.domlx" # doml_document_path = "../../tests/doml/nginx-openstack_v2_wrong.domlx"
# doml_document_path = "../../tests/doml/faas.domlx" # doml_document_path = "../../tests/doml/faas.domlx"
with open(doml_document_path, "rb") as xmif: with open(doml_document_path, "rb") as xmif:
doc = xmif.read() doc = xmif.read()
dmc = mc.ModelChecker(doc) dmc = mc.ModelChecker(doc)
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
r = dmc.check_common_requirements(2) r = dmc.check_common_requirements(2, False, 50)
r.summarize() r.summarize()
``` ```
......
...@@ -13,7 +13,7 @@ def post(body, requirement=None): ...@@ -13,7 +13,7 @@ def post(body, requirement=None):
doml_xmi = body doml_xmi = body
try: try:
dmc = ModelChecker(doml_xmi) dmc = ModelChecker(doml_xmi)
results = dmc.check_common_requirements(2) results = dmc.check_common_requirements(threads=2, consistency_checks=False, timeout=50)
res, msg = results.summarize() res, msg = results.summarize()
if res == MCResult.sat: if res == MCResult.sat:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment