This is an automated email from the ASF dual-hosted git repository.

gongchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git


The following commit(s) were added to refs/heads/master by this push:
     new 8a11dacdb [bugfix] fix error when delete plugin (#2265)
8a11dacdb is described below

commit 8a11dacdbaf1fc6e72c21183ba042273b48aab53
Author: liutianyou <[email protected]>
AuthorDate: Thu Jul 11 16:04:37 2024 +0800

    [bugfix] fix error when delete plugin (#2265)
    
    Co-authored-by: tomsun28 <[email protected]>
---
 .../manager/controller/PluginController.java       |  2 +-
 .../manager/service/impl/PluginServiceImpl.java    | 63 +++++++++++++---------
 .../manager/service/PluginServiceTest.java         |  4 +-
 3 files changed, 42 insertions(+), 27 deletions(-)

diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/controller/PluginController.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/controller/PluginController.java
index b75f69738..dc989bd41 100644
--- 
a/manager/src/main/java/org/apache/hertzbeat/manager/controller/PluginController.java
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/controller/PluginController.java
@@ -92,7 +92,7 @@ public class PluginController {
 
     @DeleteMapping()
     @Operation(summary = "Delete plugins based on ID", description = "Delete 
plugins based on ID")
-    public ResponseEntity<Message<Void>> deleteTags(
+    public ResponseEntity<Message<Void>> deletePlugins(
         @Parameter(description = "Plugin IDs ", example = "6565463543") 
@RequestParam(required = false) List<Long> ids) {
         if (ids != null && !ids.isEmpty()) {
             pluginService.deletePlugins(new HashSet<>(ids));
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
index d5de0e588..1aeeb49b4 100644
--- 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
@@ -33,11 +33,11 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.ServiceLoader;
 import java.util.Set;
+import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Consumer;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
-import java.util.stream.Collectors;
 import javax.annotation.PostConstruct;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
@@ -77,11 +77,17 @@ public class PluginServiceImpl implements PluginService {
     private static final Map<String, Boolean> PLUGIN_ENABLE_STATUS = new 
ConcurrentHashMap<>();
 
 
-    private URLClassLoader pluginClassLoader;
+    private final List<URLClassLoader> pluginClassLoaders = new ArrayList<>();
 
     @Override
     public void deletePlugins(Set<Long> ids) {
         List<PluginMetadata> plugins = metadataDao.findAllById(ids);
+        // disable the plugins that need to be removed
+        for (PluginMetadata plugin : plugins) {
+            plugin.setEnableStatus(false);
+            updateStatus(plugin);
+        }
+        loadJarToClassLoader();
         for (PluginMetadata plugin : plugins) {
             try {
                 // delete jar file
@@ -114,12 +120,10 @@ public class PluginServiceImpl implements PluginService {
         }
     }
 
-
     static {
         PLUGIN_TYPE_MAPPING.put(Plugin.class, PluginType.POST_ALERT);
     }
 
-
     /**
      * verify the type of the jar package
      *
@@ -169,9 +173,6 @@ public class PluginServiceImpl implements PluginService {
         if (metadataDao.countPluginMetadataByName(metadata.getName()) != 0) {
             throw new CommonException("A plugin named " + metadata.getName() + 
" already exists");
         }
-        if 
(itemDao.countPluginItemByClassIdentifierIn((metadata.getItems().stream().map(PluginItem::getClassIdentifier).collect(Collectors.toList())))
 != 0) {
-            throw new CommonException("Plugin already exists");
-        }
     }
 
     @Override
@@ -185,19 +186,27 @@ public class PluginServiceImpl implements PluginService {
         if (fileName == null) {
             throw new CommonException("Failed to upload plugin");
         }
+        fileName = UUID.randomUUID().toString().replace("-", "") + "_" + 
fileName;
         File destFile = new File(extLibDir, fileName);
         FileUtils.createParentDirectories(destFile);
         pluginUpload.getJarFile().transferTo(destFile);
-        List<PluginItem> pluginItems = validateJarFile(destFile);
-
+        List<PluginItem> pluginItems;
+        PluginMetadata pluginMetadata;
+        try {
+            pluginItems = validateJarFile(destFile);
+            pluginMetadata = PluginMetadata.builder()
+                .name(pluginUpload.getName())
+                .enableStatus(true)
+                .items(pluginItems).jarFilePath(destFile.getAbsolutePath())
+                .gmtCreate(LocalDateTime.now())
+                .build();
+            validateMetadata(pluginMetadata);
+        } catch (Exception e) {
+            // verification failed, delete file
+            FileUtils.delete(destFile);
+            throw e;
+        }
         // save plugin metadata
-        PluginMetadata pluginMetadata = PluginMetadata.builder()
-            .name(pluginUpload.getName())
-            .enableStatus(true)
-            .items(pluginItems).jarFilePath(destFile.getAbsolutePath())
-            .gmtCreate(LocalDateTime.now())
-            .build();
-        validateMetadata(pluginMetadata);
         metadataDao.save(pluginMetadata);
         itemDao.saveAll(pluginItems);
         // load jar to classloader
@@ -238,16 +247,18 @@ public class PluginServiceImpl implements PluginService {
     @PostConstruct
     private void loadJarToClassLoader() {
         try {
-            if (pluginClassLoader != null) {
-                pluginClassLoader.close();
+            for (URLClassLoader pluginClassLoader : pluginClassLoaders) {
+                if (pluginClassLoader != null) {
+                    pluginClassLoader.close();
+                }
             }
+            pluginClassLoaders.clear();
+            System.gc();
             List<PluginMetadata> plugins = 
metadataDao.findPluginMetadataByEnableStatusTrue();
-            List<URL> urls = new ArrayList<>();
             for (PluginMetadata metadata : plugins) {
                 URL url = new File(metadata.getJarFilePath()).toURI().toURL();
-                urls.add(url);
+                pluginClassLoaders.add(new URLClassLoader(new URL[]{url}, 
Plugin.class.getClassLoader()));
             }
-            pluginClassLoader = new URLClassLoader(urls.toArray(new URL[0]));
         } catch (MalformedURLException e) {
             log.error("Failed to load plugin:{}", e.getMessage());
             throw new CommonException("Failed to load plugin:" + 
e.getMessage());
@@ -258,10 +269,12 @@ public class PluginServiceImpl implements PluginService {
 
     @Override
     public <T> void pluginExecute(Class<T> clazz, Consumer<T> execute) {
-        ServiceLoader<T> load = ServiceLoader.load(clazz, pluginClassLoader);
-        for (T t : load) {
-            if (pluginIsEnable(t.getClass())) {
-                execute.accept(t);
+        for (URLClassLoader pluginClassLoader : pluginClassLoaders) {
+            ServiceLoader<T> load = ServiceLoader.load(clazz, 
pluginClassLoader);
+            for (T t : load) {
+                if (pluginIsEnable(t.getClass())) {
+                    execute.accept(t);
+                }
             }
         }
     }
diff --git 
a/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
 
b/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
index 238b47b06..4187b99f8 100644
--- 
a/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
+++ 
b/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
@@ -113,7 +113,9 @@ class PluginServiceTest {
         Set<Long> ids = new HashSet<>(Collections.singletonList(1L));
 
         
when(metadataDao.findAllById(ids)).thenReturn(Collections.singletonList(plugin));
-        doNothing().when(metadataDao).deleteById(anyLong());
+        when(metadataDao.findById(anyLong())).thenReturn(Optional.of(plugin));
+        when(metadataDao.save(plugin)).thenReturn(plugin);
+        doNothing().when(metadataDao).deleteById(1L);
 
         pluginService.deletePlugins(ids);
         verify(metadataDao, times(1)).deleteById(1L);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to