diff options
Diffstat (limited to 'src')
5 files changed, 40 insertions, 18 deletions
diff --git a/src/main/java/org/openslx/imagemaster/Globals.java b/src/main/java/org/openslx/imagemaster/Globals.java index 9ccaa4e..690996e 100644 --- a/src/main/java/org/openslx/imagemaster/Globals.java +++ b/src/main/java/org/openslx/imagemaster/Globals.java @@ -38,17 +38,13 @@ public class Globals stream.close(); // check properties - Util.notNullOrEmptyFatal( getImageDir(), "Image directory must be set." ); Util.notNullOrEmptyFatal( getSslKeystoreFile(), "SSL keystore file must be set." ); Util.notNullOrEmptyFatal( getSslKeystoreAlias(), "SSL keystore alias must be set." ); Util.notNullOrEmptyFatal( getSslKeystorePassword(), "SSL keystore password must be set." ); Util.notNullFatal( getSessionTimeoutUser(), "Session timeout user must be set." ); Util.notNullFatal( getSessionTimeoutServer(), "Session timeout server must be set." ); - if ( getFiletransferPortSsl() == 0 && getFiletransferPortPlain() == 0 ) { - LOGGER.fatal( "either SSL or plain port for file transfer must be set." ); - System.exit( 2 ); - } + if ( getThriftPortSsl() == 0 && getThriftPortPlain() == 0 ) { LOGGER.fatal( "either SSL or plain port for thrift must be set." ); System.exit( 2 ); @@ -163,4 +159,10 @@ public class Globals return imgPath; } + public static boolean isReadOnlyMode() + { + return ( getFiletransferPortPlain() <= 0 && getFiletransferPortSsl() <= 0 ) + || Util.isEmpty( getImageDir() ); + } + } diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java b/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java index 8b6d197..22c4183 100644 --- a/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java +++ b/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java @@ -33,7 +33,7 @@ import org.openslx.filetransfer.Uploader; import org.openslx.imagemaster.Globals; import org.openslx.imagemaster.db.mappers.DbImage; import org.openslx.thrifthelper.ImagePublishDataEx; -import org.openslx.util.GrowingThreadPoolExecutor; +import org.openslx.util.CascadedThreadPoolExecutor; import org.openslx.util.QuickTimer; import org.openslx.util.QuickTimer.Task; @@ -53,9 +53,9 @@ public class ConnectionHandler implements IncomingEvent private static Map<String, OutgoingTransfer> outgoingTransfers = new ConcurrentHashMap<>(); private static IncomingEvent eventHandler = new ConnectionHandler(); - private final ExecutorService transferPool = new GrowingThreadPoolExecutor( 1, MAX_TRANSFERS * 2, 1, TimeUnit.MINUTES, + private final ExecutorService transferPool = new CascadedThreadPoolExecutor( 1, MAX_TRANSFERS * 2, 1, TimeUnit.MINUTES, new SynchronousQueue<Runnable>(), - new PrioThreadFactory( "TransferPool", Thread.NORM_PRIORITY - 2 ) ); + new PrioThreadFactory( "TransferPool", Thread.NORM_PRIORITY - 2 ), null ); private static final Listener plainListener; private static final Listener sslListener; @@ -74,11 +74,15 @@ public class ConnectionHandler implements IncomingEvent SSLContext sslContext = SSLContext.getInstance( "TLSv1.2" ); KeyManager[] keyManagers = kmf.getKeyManagers(); sslContext.init( keyManagers, null, null ); - ssl = new Listener( eventHandler, sslContext, Globals.getFiletransferPortSsl(), Globals.getFiletransferTimeout() * 1000 ); - ssl.start(); - plain = new Listener( eventHandler, null, Globals.getFiletransferPortPlain(), Globals.getFiletransferTimeout() * 1000 ); - plain.start(); - // TODO: Bail out/retry if failed, getters for ports + if ( Globals.getFiletransferPortSsl() > 0 ) { + ssl = new Listener( eventHandler, sslContext, Globals.getFiletransferPortSsl(), Globals.getFiletransferTimeout() * 1000 ); + ssl.start(); + } + if ( Globals.getFiletransferPortPlain() > 0 ) { + plain = new Listener( eventHandler, null, Globals.getFiletransferPortPlain(), Globals.getFiletransferTimeout() * 1000 ); + plain.start(); + } + // TODO: Bail out/retry if failed } catch ( Exception e ) { LOGGER.error( "Initialization failed.", e ); System.exit( 2 ); @@ -110,14 +114,14 @@ public class ConnectionHandler implements IncomingEvent public static int getSslPort() { - if ( sslListener.isRunning() ) + if ( sslListener != null && sslListener.isRunning() ) return sslListener.getPort(); return 0; } public static int getPlainPort() { - if ( plainListener.isRunning() ) + if ( plainListener != null && plainListener.isRunning() ) return plainListener.getPort(); return 0; } @@ -147,8 +151,6 @@ public class ConnectionHandler implements IncomingEvent } else { absDestination = new File( Globals.getImageDir(), existing.exImagePath ); } - plainListener.start(); - sslListener.start(); try { transfer = new IncomingTransfer( img, blockHashes, absDestination, getPlainPort(), getSslPort() ); } catch ( FileNotFoundException e ) { diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java b/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java index 7b499be..d0bb386 100644 --- a/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java +++ b/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java @@ -51,6 +51,7 @@ public class IncomingTransfer extends IncomingTransferBase } catch ( SQLException e ) { } } + LOGGER.info( "Incoming transfer started" ); } @Override @@ -69,6 +70,8 @@ public class IncomingTransfer extends IncomingTransferBase @Override protected boolean hasEnoughFreeSpace() { + if ( Globals.isReadOnlyMode() ) + return false; long space = Globals.getImagePath().getUsableSpace(); return space > MIN_FREE_SPACE_BYTES; } @@ -82,6 +85,7 @@ public class IncomingTransfer extends IncomingTransferBase } catch ( SQLException e ) { // Nothing to do } + LOGGER.info( "Incoming transfer ended" ); return true; } diff --git a/src/main/java/org/openslx/imagemaster/thrift/server/HttpListener.java b/src/main/java/org/openslx/imagemaster/thrift/server/HttpListener.java index b56f64e..b39d993 100644 --- a/src/main/java/org/openslx/imagemaster/thrift/server/HttpListener.java +++ b/src/main/java/org/openslx/imagemaster/thrift/server/HttpListener.java @@ -2,6 +2,7 @@ package org.openslx.imagemaster.thrift.server; import java.io.IOException; import java.util.Arrays; +import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -9,6 +10,7 @@ import org.apache.thrift.protocol.TJSONProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TMemoryBuffer; import org.openslx.bwlp.thrift.iface.MasterServer; +import org.openslx.util.CascadedThreadPoolExecutor; import org.openslx.util.Util; import fi.iki.elonen.NanoHTTPD; @@ -23,7 +25,7 @@ public class HttpListener extends NanoHTTPD public HttpListener( String hostname, int port ) throws IOException { - super( hostname, port, 64, 16 ); + super( hostname, port, new CascadedThreadPoolExecutor( 4, 32, 1, TimeUnit.MINUTES, 2, "HTTP" ) ); this.maxRequestSize = 1_000_000; } diff --git a/src/main/java/org/openslx/imagemaster/thrift/server/MasterServerHandler.java b/src/main/java/org/openslx/imagemaster/thrift/server/MasterServerHandler.java index d423c36..7138111 100644 --- a/src/main/java/org/openslx/imagemaster/thrift/server/MasterServerHandler.java +++ b/src/main/java/org/openslx/imagemaster/thrift/server/MasterServerHandler.java @@ -140,6 +140,10 @@ public class MasterServerHandler implements MasterServer.Iface public List<ImageSummaryRead> getPublicImages( String sessionId, int page ) throws TAuthorizationException, TInvocationException { + if ( Globals.isReadOnlyMode() ) { + throw new TInvocationException( InvocationError.INTERNAL_SERVER_ERROR, + "This is a read-only failover master-server. Image up-/downloads are not available." ); + } Session session = SessionManager.getSessionFromSessionId( sessionId ); if ( session == null ) throw new TAuthorizationException( AuthorizationError.NOT_AUTHENTICATED, "Session ID not valid" ); @@ -263,6 +267,10 @@ public class MasterServerHandler implements MasterServer.Iface public TransferInformation submitImage( String userToken, ImagePublishData img, List<ByteBuffer> blockHashes ) throws TAuthorizationException, TInvocationException, TTransferRejectedException { + // Fallback mode, don't allow up/downloads + if( Globals.isReadOnlyMode() ) { + throw new TTransferRejectedException( "This is a read-only failover master-server. Image up-/downloads are not available." ); + } // Valid submit session? Session session = SessionManager.getSessionFromToken( userToken ); if ( session == null ) @@ -360,6 +368,10 @@ public class MasterServerHandler implements MasterServer.Iface public TransferInformation downloadImage( String sessionId, String imageVersionId ) throws TAuthorizationException, TInvocationException, TNotFoundException, TTransferRejectedException { + // Fallback mode, don't allow up/downloads + if( Globals.isReadOnlyMode() ) { + throw new TTransferRejectedException( "This is a read-only failover master-server. Image up-/downloads are not available." ); + } // Valid submit session? Session session = SessionManager.getSessionFromToken( sessionId ); if ( session == null ) |