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]