From f4514c1745ac7aaf3c23cf1f5eceaf1cdcd54aa0 Mon Sep 17 00:00:00 2001 From: Heemin Kim Date: Tue, 15 Aug 2023 19:10:38 -0700 Subject: [PATCH] Revert datasource state when delete fails (#382) Signed-off-by: Heemin Kim --- CHANGELOG.md | 1 + .../action/DeleteDatasourceTransportAction.java | 13 +++++++++++-- .../DeleteDatasourceTransportActionTests.java | 16 ++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d403b166..ee53738a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), * IP2Geo processor implementation ([#362](https://github.com/opensearch-project/geospatial/pull/362)) ### Enhancements ### Bug Fixes +* Revert datasource state when delete fails([#382](https://github.com/opensearch-project/geospatial/pull/382)) ### Infrastructure * Make jacoco report to be generated faster in local ([#267](https://github.com/opensearch-project/geospatial/pull/267)) * Exclude lombok generated code from jacoco coverage report ([#268](https://github.com/opensearch-project/geospatial/pull/268)) diff --git a/src/main/java/org/opensearch/geospatial/ip2geo/action/DeleteDatasourceTransportAction.java b/src/main/java/org/opensearch/geospatial/ip2geo/action/DeleteDatasourceTransportAction.java index 0522e228..cfd12ba3 100644 --- a/src/main/java/org/opensearch/geospatial/ip2geo/action/DeleteDatasourceTransportAction.java +++ b/src/main/java/org/opensearch/geospatial/ip2geo/action/DeleteDatasourceTransportAction.java @@ -111,9 +111,18 @@ protected void deleteDatasource(final String datasourceName) throws IOException if (datasource == null) { throw new ResourceNotFoundException("no such datasource exist"); } - + DatasourceState previousState = datasource.getState(); setDatasourceStateAsDeleting(datasource); - geoIpDataDao.deleteIp2GeoDataIndex(datasource.getIndices()); + + try { + geoIpDataDao.deleteIp2GeoDataIndex(datasource.getIndices()); + } catch (Exception e) { + if (previousState.equals(datasource.getState()) == false) { + datasource.setState(previousState); + datasourceDao.updateDatasource(datasource); + } + throw e; + } datasourceDao.deleteDatasource(datasource); } diff --git a/src/test/java/org/opensearch/geospatial/ip2geo/action/DeleteDatasourceTransportActionTests.java b/src/test/java/org/opensearch/geospatial/ip2geo/action/DeleteDatasourceTransportActionTests.java index 3db3583a..aeb4e594 100644 --- a/src/test/java/org/opensearch/geospatial/ip2geo/action/DeleteDatasourceTransportActionTests.java +++ b/src/test/java/org/opensearch/geospatial/ip2geo/action/DeleteDatasourceTransportActionTests.java @@ -8,6 +8,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -162,4 +163,19 @@ public void testDeleteDatasource_whenProcessorIsCreatedDuringDeletion_thenThrowE verify(geoIpDataDao, never()).deleteIp2GeoDataIndex(datasource.getIndices()); verify(datasourceDao, never()).deleteDatasource(datasource); } + + @SneakyThrows + public void testDeleteDatasource_whenDeleteFailsAfterStateIsChanged_thenRevertState() { + Datasource datasource = randomDatasource(); + datasource.setState(DatasourceState.AVAILABLE); + when(datasourceDao.getDatasource(datasource.getName())).thenReturn(datasource); + doThrow(new RuntimeException()).when(geoIpDataDao).deleteIp2GeoDataIndex(datasource.getIndices()); + + // Run + expectThrows(RuntimeException.class, () -> action.deleteDatasource(datasource.getName())); + + // Verify + verify(datasourceDao, times(2)).updateDatasource(datasource); + assertEquals(DatasourceState.AVAILABLE, datasource.getState()); + } }