Skip to content

Add monitoring for upload from url and update executor max threads #1591

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ public class ApplicationConfiguration {
public static final int DEFAULT_MAX_STOP_DELAY_IN_SECONDS = 300;
public static final String DEFAULT_GLOBAL_AUDITOR_ORIGIN = "uaa";
public static final int DEFAULT_SPRING_SCHEDULER_TASK_EXECUTOR_THREADS = 3;
public static final int DEFAULT_FILES_ASYNC_UPLOAD_EXECUTOR_MAX_THREADS = 50;
public static final int DEFAULT_FILES_ASYNC_UPLOAD_EXECUTOR_MAX_THREADS = 6;
public static final boolean DEFAULT_ENABLE_ON_START_FILES_WITHOUT_CONTENT_CLEANER = false;
public static final int DEFAULT_THREADS_FOR_FILE_UPLOAD_TO_CONTROLLER = 6;
public static final int DEFAULT_THREADS_FOR_FILE_STORAGE_UPLOAD = 7;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package org.cloudfoundry.multiapps.controller.process.util;

import jakarta.inject.Inject;
import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
package org.cloudfoundry.multiapps.controller.process.configuration;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.RunnableFuture;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration;
import org.cloudfoundry.multiapps.controller.process.util.PriorityCallable;
import org.cloudfoundry.multiapps.controller.process.util.PriorityFuture;
import org.cloudfoundry.multiapps.controller.process.util.PriorityFutureComparator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import jakarta.inject.Inject;

@Configuration
public class FileUploadThreadPoolConfiguration {

Expand All @@ -31,23 +36,43 @@ public PriorityBlockingQueue<Runnable> fileUploadPriorityBlockingQueue() {
@Bean(name = "fileStorageThreadPool")
public ExecutorService fileStorageThreadPool(PriorityBlockingQueue<Runnable> fileUploadPriorityBlockingQueue) {
return new ThreadPoolExecutor(applicationConfiguration.getThreadsForFileStorageUpload(),
applicationConfiguration.getThreadsForFileStorageUpload(), 0L, TimeUnit.MILLISECONDS,
applicationConfiguration.getThreadsForFileStorageUpload(),
0L,
TimeUnit.MILLISECONDS,
fileUploadPriorityBlockingQueue) {

@Override
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
RunnableFuture<T> newTaskFor = super.newTaskFor(callable);
return new PriorityFuture<>(newTaskFor, ((PriorityCallable<T>) callable).getPriority()
.getValue());
return new PriorityFuture<>(newTaskFor,
((PriorityCallable<T>) callable).getPriority()
.getValue());
}
};
}

@Bean(name = "appUploaderThreadPool")
public ExecutorService appUploaderThreadPool() {
return new ThreadPoolExecutor(applicationConfiguration.getThreadsForFileUploadToController(),
applicationConfiguration.getThreadsForFileUploadToController(), 0, TimeUnit.MILLISECONDS,
new SynchronousQueue<>(), new ThreadPoolExecutor.AbortPolicy());
applicationConfiguration.getThreadsForFileUploadToController(),
0,
TimeUnit.MILLISECONDS,
new SynchronousQueue<>(),
new ThreadPoolExecutor.AbortPolicy());
}

@Bean("fileUploadFromUrlQueue")
public LinkedBlockingQueue<Runnable> fileUploadFromUrlQueue() {
return new LinkedBlockingQueue<>(20);
}

@Bean(name = "asyncFileUploadExecutor")
public ExecutorService asyncFileUploadExecutor(LinkedBlockingQueue<Runnable> fileUploadFromUrlQueue) {
return new ThreadPoolExecutor(5,
applicationConfiguration.getFilesAsyncUploadExecutorMaxThreads(),
30,
TimeUnit.SECONDS,
fileUploadFromUrlQueue);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.concurrent.PriorityBlockingQueue;

import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration;
import org.cloudfoundry.multiapps.controller.process.configuration.FileUploadThreadPoolConfiguration;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,18 @@
package org.cloudfoundry.multiapps.controller.web.configuration;

import jakarta.inject.Inject;
import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration;
import org.cloudfoundry.multiapps.controller.persistence.util.EnvironmentServicesFinder;
import org.cloudfoundry.multiapps.controller.web.configuration.bean.factory.ObjectStoreFileStorageFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.StandardServletMultipartResolver;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import jakarta.inject.Inject;

@Configuration
public class FileStorageConfiguration {

private static final String OBJECT_STORE_SERVICE_NAME = "deploy-service-os";
private static final long MAX_UPLOAD_SIZE = 4294967296L; // 4GB

@Inject
@Bean
Expand All @@ -30,11 +24,4 @@ public ObjectStoreFileStorageFactoryBean objectStoreFileStorage(EnvironmentServi
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}

@Inject
@Bean(name = "asyncFileUploadExecutor")
public ExecutorService asyncFileUploadExecutor(ApplicationConfiguration configuration) {
return new ThreadPoolExecutor(5, configuration.getFilesAsyncUploadExecutorMaxThreads(), 30, TimeUnit.SECONDS,
new LinkedBlockingQueue<>());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.cloudfoundry.multiapps.controller.web.configuration;

import java.util.concurrent.LinkedBlockingQueue;

import jakarta.inject.Inject;
import jakarta.inject.Named;

@Named
public class FileUploadFromUrlThreadPoolInformation {

private final LinkedBlockingQueue<Runnable> fileUploadFromUrlQueue;

@Inject
public FileUploadFromUrlThreadPoolInformation(LinkedBlockingQueue<Runnable> fileUploadFromUrlQueue) {
this.fileUploadFromUrlQueue = fileUploadFromUrlQueue;
}

public int getFileUploadFromUrlQueueSize() {
return fileUploadFromUrlQueue.size();
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.cloudfoundry.multiapps.controller.web.monitoring;
package org.cloudfoundry.multiapps.controller.web.configuration;

import java.util.concurrent.PriorityBlockingQueue;

import jakarta.inject.Inject;
import jakarta.inject.Named;

import java.util.concurrent.PriorityBlockingQueue;

@Named
public class FileUploadThreadPoolInformation {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package org.cloudfoundry.multiapps.controller.web.monitoring;

import jakarta.inject.Inject;
import jakarta.inject.Named;
import java.nio.file.Paths;
import java.time.Duration;

import org.cloudfoundry.multiapps.controller.core.model.CachedObject;
import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration;
import org.cloudfoundry.multiapps.controller.web.configuration.FileUploadFromUrlThreadPoolInformation;
import org.cloudfoundry.multiapps.controller.web.configuration.FileUploadThreadPoolInformation;

import java.nio.file.Paths;
import java.time.Duration;
import jakarta.inject.Inject;
import jakarta.inject.Named;

@Named
public class Metrics implements MetricsMBean {
Expand All @@ -16,17 +19,19 @@ public class Metrics implements MetricsMBean {
private final CachedObject<CloudFoundryClientThreadInformation> cachedCloudFoundryClientThreadMonitor;
private final FlowableJobExecutorInformation flowableJobExecutorInformation;
private final FileUploadThreadPoolInformation fileUploadThreadPoolInformation;
private final FileUploadFromUrlThreadPoolInformation fileUploadFromUrlThreadPoolInformation;

@Inject
public Metrics(ApplicationConfiguration appConfigurations, FssMonitor fssMonitor,
FlowableJobExecutorInformation flowableJobExecutorInformation,
FileUploadThreadPoolInformation fileUploadThreadPoolInformation) {
FileUploadThreadPoolInformation fileUploadThreadPoolInformation,
FileUploadFromUrlThreadPoolInformation fileUploadFromUrlThreadPoolInformation) {
this.fssMonitor = fssMonitor;
this.cachedFlowableThreadMonitor = new CachedObject<>(Duration.ofSeconds(appConfigurations.getThreadMonitorCacheUpdateInSeconds()));
this.cachedCloudFoundryClientThreadMonitor = new CachedObject<>(
Duration.ofSeconds(appConfigurations.getThreadMonitorCacheUpdateInSeconds()));
this.cachedCloudFoundryClientThreadMonitor = new CachedObject<>(Duration.ofSeconds(appConfigurations.getThreadMonitorCacheUpdateInSeconds()));
this.flowableJobExecutorInformation = flowableJobExecutorInformation;
this.fileUploadThreadPoolInformation = fileUploadThreadPoolInformation;
this.fileUploadFromUrlThreadPoolInformation = fileUploadFromUrlThreadPoolInformation;
}

@Override
Expand Down Expand Up @@ -85,4 +90,9 @@ public int getCurrentJobExecutorQueueSize() {
public int getFileToUploadQueueSize() {
return fileUploadThreadPoolInformation.getFileUploadPriorityBlockingQueueSize();
}

@Override
public int getFileToUploadFromUrlQueueSize() {
return fileUploadFromUrlThreadPoolInformation.getFileUploadFromUrlQueueSize();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,6 @@ public interface MetricsMBean {

int getFileToUploadQueueSize();

int getFileToUploadFromUrlQueueSize();

}
Loading