summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/openslx/imagemaster/Globals.java12
-rw-r--r--src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java26
-rw-r--r--src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java4
-rw-r--r--src/main/java/org/openslx/imagemaster/thrift/server/HttpListener.java4
-rw-r--r--src/main/java/org/openslx/imagemaster/thrift/server/MasterServerHandler.java12
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 )