From 05f5f35fa0edcaae8210609a300b36d4dbb494b2 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 28 Jan 2021 12:59:06 +0100 Subject: [PATCH] partial implementation of the new delete methods --- .../manager/controller/MDStoreController.java | 35 +++++++++++-------- .../manager/controller/StatusResponse.java | 1 + .../mdstore/manager/utils/DatabaseUtils.java | 26 +++++++------- .../controller/MDStoreControllerTest.java | 22 +++++++----- 4 files changed, 46 insertions(+), 38 deletions(-) diff --git a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java index 1cca3b8a..a66fad11 100644 --- a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java +++ b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreController.java @@ -4,12 +4,13 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -33,6 +34,8 @@ public class MDStoreController extends AbstractDnetController { @Autowired private DatabaseUtils databaseUtils; + private static final Logger log = LoggerFactory.getLogger(DatabaseUtils.class); + @ApiOperation("Return all the mdstores") @GetMapping("/") public Iterable find() { @@ -96,18 +99,12 @@ public class MDStoreController extends AbstractDnetController { return databaseUtils.commitMdStoreVersion(versionId, size); } - @ApiOperation("Return all the expired versions of all the mdstores") - @GetMapping("/versions/expired") - public List listExpiredVersions() { - return databaseUtils.listExpiredVersions(); - } - @ApiOperation("Delete a mdstore version") @DeleteMapping("/version/{versionId}") public StatusResponse deleteVersion(@ApiParam("the id of the version that has to be deleted") @PathVariable final String versionId, @ApiParam("if true, the controls on writing and readcount values will be skipped") @RequestParam(required = false, defaultValue = "false") final boolean force) throws MDStoreManagerException { - databaseUtils.deleteMdStoreVersions(force, versionId); + databaseUtils.deleteMdStoreVersion(versionId, force); return StatusResponse.DELETED; } @@ -125,13 +122,20 @@ public class MDStoreController extends AbstractDnetController { return databaseUtils.resetReading(versionId); } - @ApiOperation("Delete multiple mdstore versions") - @PostMapping("/versions/deleteList") - public StatusResponse deleteVersions(@ApiParam("the list of ids of the versions that have to be deleted") @RequestBody final String[] versions, - @ApiParam("if true, the controls on writing and readcount values will be skipped") @RequestParam(required = false, defaultValue = "false") final boolean force) - throws MDStoreManagerException { - databaseUtils.deleteMdStoreVersions(force, versions); - return StatusResponse.DELETED; + @ApiOperation("Delete expired versions") + @PostMapping("/versions/expired") + public StatusResponse deleteExpiredVersions() { + new Thread(() -> { + for (final String v : databaseUtils.listExpiredVersions()) { + try { + databaseUtils.deleteMdStoreVersion(v, true); + } catch (final MDStoreManagerException e) { + log.warn("Error deleteting version " + v); + } + } + }).start(); + + return StatusResponse.DELETING; } @ApiOperation("Show informations") @@ -141,6 +145,7 @@ public class MDStoreController extends AbstractDnetController { info.put("number_of_mdstores", databaseUtils.countMdStores()); info.put("hadoop_cluster", databaseUtils.getHadoopCluster()); info.put("hdfs_base_path", databaseUtils.getHdfsBasePath()); + info.put("expired_versions", databaseUtils.listExpiredVersions()); return info; } diff --git a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/StatusResponse.java b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/StatusResponse.java index 463212bc..36d8051b 100644 --- a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/StatusResponse.java +++ b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/controller/StatusResponse.java @@ -3,6 +3,7 @@ package eu.dnetlib.data.mdstore.manager.controller; public class StatusResponse { public static final StatusResponse DELETED = new StatusResponse("DELETED"); + public static final StatusResponse DELETING = new StatusResponse("DELETING..."); private String status; diff --git a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/utils/DatabaseUtils.java b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/utils/DatabaseUtils.java index 35ec5f14..16d12dfe 100644 --- a/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/utils/DatabaseUtils.java +++ b/apps/dhp-mdstore-manager/src/main/java/eu/dnetlib/data/mdstore/manager/utils/DatabaseUtils.java @@ -155,23 +155,21 @@ public class DatabaseUtils { } @Transactional - public void deleteMdStoreVersions(final boolean force, final String... versions) throws MDStoreManagerException { + public void deleteMdStoreVersion(final String versionId, final boolean force) throws MDStoreManagerException { - for (final String versionId : versions) { - final MDStoreVersion v = mdstoreVersionRepository.findById(versionId).orElseThrow(() -> new MDStoreManagerException("Version not found")); + final MDStoreVersion v = mdstoreVersionRepository.findById(versionId).orElseThrow(() -> new MDStoreManagerException("Version not found")); - if (mdstoreCurrentVersionRepository - .countByCurrentVersion(versionId) > 0) { - throw new MDStoreManagerException("I cannot delete this version because it is the current version"); - } - - if (!force) { - if (v.isWriting()) { throw new MDStoreManagerException("I cannot delete this version because it is in write mode"); } - if (v.getReadCount() > 0) { throw new MDStoreManagerException("I cannot delete this version because it is in read mode"); } - } - - mdstoreVersionRepository.delete(v); + if (mdstoreCurrentVersionRepository + .countByCurrentVersion(versionId) > 0) { + throw new MDStoreManagerException("I cannot delete this version because it is the current version"); } + + if (!force) { + if (v.isWriting()) { throw new MDStoreManagerException("I cannot delete this version because it is in write mode"); } + if (v.getReadCount() > 0) { throw new MDStoreManagerException("I cannot delete this version because it is in read mode"); } + } + + mdstoreVersionRepository.delete(v); } public String getHdfsBasePath() { diff --git a/apps/dhp-mdstore-manager/src/test/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreControllerTest.java b/apps/dhp-mdstore-manager/src/test/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreControllerTest.java index 16a40a01..8134e6e0 100644 --- a/apps/dhp-mdstore-manager/src/test/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreControllerTest.java +++ b/apps/dhp-mdstore-manager/src/test/java/eu/dnetlib/data/mdstore/manager/controller/MDStoreControllerTest.java @@ -14,6 +14,7 @@ import org.springframework.boot.test.context.SpringBootTest; import eu.dnetlib.data.mdstore.manager.common.model.MDStoreVersion; import eu.dnetlib.data.mdstore.manager.common.model.MDStoreWithInfo; import eu.dnetlib.data.mdstore.manager.exceptions.MDStoreManagerException; +import eu.dnetlib.data.mdstore.manager.utils.DatabaseUtils; @Disabled @SpringBootTest @@ -22,6 +23,9 @@ class MDStoreControllerTest { @Autowired private MDStoreController controller; + @Autowired + private DatabaseUtils databaseUtils; + @Test void testSimpleCreationAndDelete() throws MDStoreManagerException { @@ -147,19 +151,19 @@ class MDStoreControllerTest { final String v2 = controller.prepareNewVersion(mdId).getId(); final String v3 = controller.prepareNewVersion(mdId).getId(); - assertEquals(0, controller.listExpiredVersions().size()); + assertEquals(0, databaseUtils.listExpiredVersions().size()); controller.commitVersion(v3, 1111l).getId(); assertEquals(v3, controller.getMdStore(mdId).getCurrentVersion()); - assertEquals(1, controller.listExpiredVersions().size()); + assertEquals(1, databaseUtils.listExpiredVersions().size()); controller.commitVersion(v1, 2222l).getId(); assertEquals(v1, controller.getMdStore(mdId).getCurrentVersion()); - assertEquals(2, controller.listExpiredVersions().size()); + assertEquals(2, databaseUtils.listExpiredVersions().size()); controller.commitVersion(v2, 3333l).getId(); assertEquals(v2, controller.getMdStore(mdId).getCurrentVersion()); - assertEquals(3, controller.listExpiredVersions().size()); + assertEquals(3, databaseUtils.listExpiredVersions().size()); controller.delete(mdId); } @@ -185,14 +189,14 @@ class MDStoreControllerTest { final String vr3 = controller.startReading(mdId).getId(); assertEquals(v1, vr3); - assertEquals(0, controller.listExpiredVersions().size()); + assertEquals(0, databaseUtils.listExpiredVersions().size()); controller.endReading(vr1); - assertEquals(0, controller.listExpiredVersions().size()); + assertEquals(0, databaseUtils.listExpiredVersions().size()); controller.endReading(vr3); - assertEquals(0, controller.listExpiredVersions().size()); + assertEquals(0, databaseUtils.listExpiredVersions().size()); controller.endReading(vr2); - assertEquals(1, controller.listExpiredVersions().size()); - assertEquals(firstVersion, controller.listExpiredVersions().get(0)); + assertEquals(1, databaseUtils.listExpiredVersions().size()); + assertEquals(firstVersion, databaseUtils.listExpiredVersions().get(0)); controller.delete(mdId); }