diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/index/MainIndexFactory.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/index/MainIndexFactory.java index d2fa392866..a61efb96bc 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/index/MainIndexFactory.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/index/MainIndexFactory.java @@ -70,25 +70,30 @@ private MainIndexFactory() throws MainIndexException } } - private static MainIndexFactory instance = null; + private static volatile MainIndexFactory instance = null; public static MainIndexFactory Instance() throws MainIndexException { if (instance == null) { - instance = new MainIndexFactory(); - Runtime.getRuntime().addShutdownHook(new Thread(()-> + synchronized (MainIndexFactory.class) { - try + if (instance == null) { - instance.closeAll(); + instance = new MainIndexFactory(); + Runtime.getRuntime().addShutdownHook(new Thread(() -> + { + try + { + instance.closeAll(); + } catch (MainIndexException e) + { + logger.error("Failed to close all main index instances.", e); + e.printStackTrace(); + } + })); } - catch (MainIndexException e) - { - logger.error("Failed to close all main index instances.", e); - e.printStackTrace(); - } - })); + } } return instance; } diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/index/SinglePointIndexFactory.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/index/SinglePointIndexFactory.java index dc2ef45426..eb2ae66625 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/index/SinglePointIndexFactory.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/index/SinglePointIndexFactory.java @@ -82,25 +82,31 @@ private SinglePointIndexFactory() this.singlePointIndexProviders = providersBuilder.build(); } - private static SinglePointIndexFactory instance = null; + private static volatile SinglePointIndexFactory instance = null; public static SinglePointIndexFactory Instance() { if (instance == null) { - instance = new SinglePointIndexFactory(); - Runtime.getRuntime().addShutdownHook(new Thread(()-> + synchronized (SinglePointIndexFactory.class) { - try - { - instance.closeAll(); - } - catch (SinglePointIndexException e) + if (instance == null) { - logger.error("Failed to close all single point index instances.", e); - e.printStackTrace(); + instance = new SinglePointIndexFactory(); + Runtime.getRuntime().addShutdownHook(new Thread(()-> + { + try + { + instance.closeAll(); + } + catch (SinglePointIndexException e) + { + logger.error("Failed to close all single point index instances.", e); + e.printStackTrace(); + } + })); } - })); + } } return instance; } diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/layout/IndexFactory.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/layout/IndexFactory.java index 281baf94a0..1c8b4f90f6 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/layout/IndexFactory.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/layout/IndexFactory.java @@ -26,15 +26,14 @@ public class IndexFactory { - private static IndexFactory instance = null; + private static final class InstanceHolder + { + private static final IndexFactory instance = new IndexFactory(); + } public static IndexFactory Instance() { - if (instance == null) - { - instance = new IndexFactory(); - } - return instance; + return InstanceHolder.instance; } private final Map splitsIndexes; diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/metadata/MetadataCache.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/metadata/MetadataCache.java index dbb288399d..35c368fa50 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/metadata/MetadataCache.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/metadata/MetadataCache.java @@ -35,11 +35,14 @@ */ public class MetadataCache { - private static final MetadataCache instance = new MetadataCache(); + private static final class InstanceHolder + { + private static final MetadataCache instance = new MetadataCache(); + } public static MetadataCache Instance() { - return instance; + return InstanceHolder.instance; } private class TransMetadata diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/metadata/MetadataService.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/metadata/MetadataService.java index c994223f9f..ef667d17dc 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/metadata/MetadataService.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/metadata/MetadataService.java @@ -34,6 +34,7 @@ import org.apache.logging.log4j.Logger; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -48,7 +49,7 @@ public class MetadataService { private static final Logger logger = LogManager.getLogger(MetadataService.class); private static final MetadataService defaultInstance; - private static final Map otherInstances = new HashMap<>(); + private static final Map otherInstances = new ConcurrentHashMap<>(); static { @@ -94,7 +95,7 @@ public static MetadataService Instance() * @param port the port of the metadata server * @return the created metadata service instance */ - public static MetadataService CreateInstance(String host, int port) + public static synchronized MetadataService CreateInstance(String host, int port) { HostAddress address = HostAddress.fromParts(host, port); MetadataService metadataService = otherInstances.get(address); diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/SchedulerFactory.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/SchedulerFactory.java index 0eeaab92ff..16a7398c11 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/SchedulerFactory.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/SchedulerFactory.java @@ -30,15 +30,14 @@ */ public class SchedulerFactory { - private static SchedulerFactory instance; + private static final class InstanceHolder + { + private static final SchedulerFactory instance = new SchedulerFactory(); + } public static SchedulerFactory Instance() { - if (instance == null) - { - instance = new SchedulerFactory(); - } - return instance; + return InstanceHolder.instance; } private final Scheduler scheduler; diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/StorageFactory.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/StorageFactory.java index b8a660757e..18959cd2b0 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/StorageFactory.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/StorageFactory.java @@ -77,24 +77,30 @@ private StorageFactory() this.storageProviders = providersBuilder.build(); } - private static StorageFactory instance = null; + private static volatile StorageFactory instance = null; public static StorageFactory Instance() { if (instance == null) { - instance = new StorageFactory(); - Runtime.getRuntime().addShutdownHook(new Thread(()-> + synchronized (StorageFactory.class) { - try + if (instance == null) { - instance.closeAll(); - } catch (IOException e) - { - logger.error("Failed to close all storage instances.", e); - e.printStackTrace(); + instance = new StorageFactory(); + Runtime.getRuntime().addShutdownHook(new Thread(() -> + { + try + { + instance.closeAll(); + } catch (IOException e) + { + logger.error("Failed to close all storage instances.", e); + e.printStackTrace(); + } + })); } - })); + } } return instance; } diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/NoopScheduler.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/NoopScheduler.java index 97c948c889..2c8faeff3b 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/NoopScheduler.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/NoopScheduler.java @@ -40,15 +40,12 @@ */ public class NoopScheduler implements Scheduler { - private static Logger logger = LogManager.getLogger(NoopScheduler.class); - private static NoopScheduler instance; + private static final Logger logger = LogManager.getLogger(NoopScheduler.class); + private static final NoopScheduler instance = new NoopScheduler(); public static Scheduler Instance() { - if (instance == null) - { - instance = new NoopScheduler(); - } + // no need to create instance lazily. return instance; } diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/RateLimitedScheduler.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/RateLimitedScheduler.java index 5845dd592d..b85793f450 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/RateLimitedScheduler.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/RateLimitedScheduler.java @@ -48,16 +48,16 @@ */ public class RateLimitedScheduler extends SortMergeScheduler { - private static Logger logger = LogManager.getLogger(RateLimitedScheduler.class); - private static RateLimitedScheduler instance; + private static final Logger logger = LogManager.getLogger(RateLimitedScheduler.class); + + private static final class InstanceHolder + { + private static final RateLimitedScheduler instance = new RateLimitedScheduler(); + } public static Scheduler Instance() { - if (instance == null) - { - instance = new RateLimitedScheduler(); - } - return instance; + return InstanceHolder.instance; } private RateLimiter mbpsRateLimiter; diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/SortMergeScheduler.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/SortMergeScheduler.java index fa48d89176..24ebb1be9c 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/SortMergeScheduler.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/physical/scheduler/SortMergeScheduler.java @@ -42,16 +42,16 @@ public class SortMergeScheduler implements Scheduler { private static final Logger logger = LogManager.getLogger(SortMergeScheduler.class); - private static SortMergeScheduler instance; + + private static final class InstanceHolder + { + private static final SortMergeScheduler instance = new SortMergeScheduler(); + } private static int MaxGap; public static Scheduler Instance() { - if (instance == null) - { - instance = new SortMergeScheduler(); - } - return instance; + return InstanceHolder.instance; } protected RetryPolicy retryPolicy; diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/retina/RetinaService.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/retina/RetinaService.java index 74517a9b03..e663ba6e2b 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/retina/RetinaService.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/retina/RetinaService.java @@ -92,12 +92,11 @@ public static RetinaService Instance() * @param port the port of the retina server * @return the created retina service instance */ - public static RetinaService CreateInstance(String host, int port) + public static synchronized RetinaService CreateInstance(String host, int port) { HostAddress address = HostAddress.fromParts(host, port); return otherInstances.computeIfAbsent( - address, - addr -> new RetinaService(addr.getHostText(), addr.getPort()) + address, addr -> new RetinaService(addr.getHostText(), addr.getPort()) ); } diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransContext.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransContext.java index 3bdfc42edf..23e99888d0 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransContext.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransContext.java @@ -22,6 +22,7 @@ import io.pixelsdb.pixels.daemon.TransProto; import java.util.Map; +import java.util.Objects; import java.util.Properties; import java.util.concurrent.atomic.AtomicReference; @@ -110,6 +111,23 @@ public TransProto.TransContext toProtobuf() return builder.build(); } + @Override + public int hashCode() + { + return Objects.hash(transId); + } + + @Override + public boolean equals(Object obj) + { + if (obj instanceof TransContext) + { + TransContext that = (TransContext) obj; + return this.transId == that.transId; + } + return false; + } + @Override public int compareTo(TransContext that) { diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransContextCache.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransContextCache.java index f6605a3af6..fb3d220b9e 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransContextCache.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransContextCache.java @@ -39,15 +39,14 @@ */ public class TransContextCache { - private static TransContextCache instance; + private static final class InstanceHolder + { + private static final TransContextCache instance = new TransContextCache(); + } public static TransContextCache Instance() { - if (instance == null) - { - instance = new TransContextCache(); - } - return instance; + return InstanceHolder.instance; } private final Map transIdToContext = new ConcurrentHashMap<>(); diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransService.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransService.java index ccba7244d8..b7d62311c1 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransService.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/transaction/TransService.java @@ -32,9 +32,9 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; /** @@ -47,7 +47,7 @@ public class TransService { private static final Logger logger = LogManager.getLogger(TransService.class); private static final TransService defaultInstance; - private static final Map otherInstances = new HashMap<>(); + private static final Map otherInstances = new ConcurrentHashMap<>(); static { @@ -92,7 +92,7 @@ public static TransService Instance() * @param port the port of the trans server * @return the created trans service instance */ - public static TransService CreateInstance(String host, int port) + public static synchronized TransService CreateInstance(String host, int port) { HostAddress address = HostAddress.fromParts(host, port); TransService transService = otherInstances.get(address); diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/turbo/InvokerFactory.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/turbo/InvokerFactory.java index 1a9918c282..22d926848e 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/turbo/InvokerFactory.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/turbo/InvokerFactory.java @@ -31,11 +31,14 @@ */ public class InvokerFactory { - private static final InvokerFactory instance = new InvokerFactory(); + private static final class InstanceHolder + { + private static final InvokerFactory instance = new InvokerFactory(); + } public static InvokerFactory Instance() { - return instance; + return InstanceHolder.instance; } /** diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/ConfigFactory.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/ConfigFactory.java index 13f4c5788b..e1a46f5a62 100755 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/ConfigFactory.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/ConfigFactory.java @@ -33,20 +33,18 @@ */ public class ConfigFactory { - private static ConfigFactory instance = null; + private static final class InstanceHolder + { + private static final ConfigFactory instance = new ConfigFactory(); + } /** - * Injected classes in pixels-presto should not use this method to get ConfigFactory Instance. - * + * Injected classes in pixels-presto and pixels-trino should not use this method to get ConfigFactory Instance. * @return */ public static ConfigFactory Instance() { - if (instance == null) - { - instance = new ConfigFactory(); - } - return instance; + return InstanceHolder.instance; } // Properties is thread safe, so we do not add synchronization to it. diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/EtcdUtil.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/EtcdUtil.java index fe17e9de5b..b9d194a148 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/EtcdUtil.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/EtcdUtil.java @@ -45,7 +45,12 @@ public class EtcdUtil { private static final Logger logger = LogManager.getLogger(EtcdUtil.class); - private static final EtcdUtil instance = new EtcdUtil(); + + private static final class InstanceHolder + { + private static final EtcdUtil instance = new EtcdUtil(); + } + private final Client client; private EtcdUtil() @@ -71,7 +76,7 @@ private EtcdUtil() public static EtcdUtil Instance() { - return instance; + return InstanceHolder.instance; } /** diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/GcMonitor.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/GcMonitor.java index ead6d43112..139414f108 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/GcMonitor.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/GcMonitor.java @@ -32,6 +32,7 @@ public class GcMonitor public static GcMonitor Instance() { + // no need to create instance lazily. return instance; } diff --git a/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/MetaDBUtil.java b/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/MetaDBUtil.java index 253dfe1f58..9fe5e4f0c3 100644 --- a/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/MetaDBUtil.java +++ b/pixels-common/src/main/java/io/pixelsdb/pixels/common/utils/MetaDBUtil.java @@ -33,11 +33,15 @@ public class MetaDBUtil { private static final Logger log = LogManager.getLogger(MetaDBUtil.class); - private static final MetaDBUtil Instance = new MetaDBUtil(); + private static final class InstanceHolder + { + private static final MetaDBUtil instance = new MetaDBUtil(); + } public static MetaDBUtil Instance() { - return Instance; + // instance is to be closed in MetadataServer.shutdown(). + return InstanceHolder.instance; } private Connection connection = null; diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/DaoFactory.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/DaoFactory.java index 02ed5daa54..3d6a35d4fc 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/DaoFactory.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/DaoFactory.java @@ -8,15 +8,14 @@ */ public class DaoFactory { - private static DaoFactory instance = null; + private static final class InstanceHolder + { + private static final DaoFactory instance = new DaoFactory(); + } public static DaoFactory Instance () { - if (instance == null) - { - instance = new DaoFactory(); - } - return instance; + return InstanceHolder.instance; } private final ColumnDao columnDao; diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbFileDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbFileDao.java index f68a2ba466..dc6507ca5d 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbFileDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbFileDao.java @@ -35,9 +35,9 @@ */ public class RdbFileDao extends FileDao { - public RdbFileDao() { } + private static final Logger log = LogManager.getLogger(RdbFileDao.class); - private static final Logger log = LogManager.getLogger(RdbPathDao.class); + public RdbFileDao() { } private static final MetaDBUtil db = MetaDBUtil.Instance(); diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbLayoutDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbLayoutDao.java index 4e703b50ef..52c6ab2396 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbLayoutDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbLayoutDao.java @@ -21,7 +21,6 @@ import io.pixelsdb.pixels.common.utils.MetaDBUtil; import io.pixelsdb.pixels.daemon.MetadataProto; -import io.pixelsdb.pixels.daemon.metadata.dao.DaoFactory; import io.pixelsdb.pixels.daemon.metadata.dao.LayoutDao; import io.pixelsdb.pixels.daemon.metadata.dao.PathDao; import org.apache.logging.log4j.LogManager; @@ -38,13 +37,14 @@ */ public class RdbLayoutDao extends LayoutDao { - public RdbLayoutDao() {} - private static final Logger log = LogManager.getLogger(RdbLayoutDao.class); + public RdbLayoutDao() {} + private static final MetaDBUtil db = MetaDBUtil.Instance(); - private static final PathDao pathDao = DaoFactory.Instance().getPathDao(); + // Issue #1105: do not get pathDao from DaoFactory, otherwise it leads to recursive initialization of DaoFactory. + private static final PathDao pathDao = new RdbPathDao(); @Override public MetadataProto.Layout getById(long id) diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPathDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPathDao.java index ca14bbc04c..5836bb0538 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPathDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPathDao.java @@ -35,10 +35,10 @@ */ public class RdbPathDao extends PathDao { - public RdbPathDao() {} - private static final Logger log = LogManager.getLogger(RdbPathDao.class); + public RdbPathDao() {} + private static final MetaDBUtil db = MetaDBUtil.Instance(); @Override diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPeerDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPeerDao.java index b815063fb7..8d6fc0d714 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPeerDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPeerDao.java @@ -39,10 +39,10 @@ */ public class RdbPeerDao extends PeerDao { - public RdbPeerDao() {} - private static final Logger log = LogManager.getLogger(RdbPeerDao.class); + public RdbPeerDao() {} + private static final MetaDBUtil db = MetaDBUtil.Instance(); @Override diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPeerPathDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPeerPathDao.java index 37fad1ee4c..308f6a4628 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPeerPathDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbPeerPathDao.java @@ -23,16 +23,11 @@ import io.pixelsdb.pixels.common.utils.MetaDBUtil; import io.pixelsdb.pixels.daemon.MetadataProto; import io.pixelsdb.pixels.daemon.metadata.dao.ColumnDao; -import io.pixelsdb.pixels.daemon.metadata.dao.DaoFactory; import io.pixelsdb.pixels.daemon.metadata.dao.PeerPathDao; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.PreparedStatement; +import java.sql.*; import java.util.ArrayList; import java.util.List; @@ -42,12 +37,14 @@ */ public class RdbPeerPathDao extends PeerPathDao { - public RdbPeerPathDao() {} - private static final Logger log = LogManager.getLogger(RdbPeerPathDao.class); + public RdbPeerPathDao() {} + private static final MetaDBUtil db = MetaDBUtil.Instance(); - private static final ColumnDao columnDao = DaoFactory.Instance().getColumnDao(); + + // Issue #1105: do not get columnDao from DaoFactory, otherwise it leads to recursive initialization of DaoFactory. + private static final ColumnDao columnDao = new RdbColumnDao(); @Override public MetadataProto.PeerPath getById(long id) diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbRangeDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbRangeDao.java index e43966cd65..e1a3d74878 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbRangeDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbRangeDao.java @@ -36,10 +36,10 @@ */ public class RdbRangeDao extends RangeDao { - public RdbRangeDao() {} - private static final Logger log = LogManager.getLogger(RdbRangeDao.class); + public RdbRangeDao() {} + private static final MetaDBUtil db = MetaDBUtil.Instance(); @Override diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbRangeIndexDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbRangeIndexDao.java index 1bf9fe13d5..aa61df57c3 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbRangeIndexDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbRangeIndexDao.java @@ -35,10 +35,10 @@ */ public class RdbRangeIndexDao extends RangeIndexDao { - public RdbRangeIndexDao() {} - private static final Logger log = LogManager.getLogger(RdbRangeIndexDao.class); + public RdbRangeIndexDao() {} + private static final MetaDBUtil db = MetaDBUtil.Instance(); @Override diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSchemaDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSchemaDao.java index f21e185f1e..8ca42aed79 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSchemaDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSchemaDao.java @@ -34,10 +34,11 @@ */ public class RdbSchemaDao extends SchemaDao { + private static final Logger log = LogManager.getLogger(RdbSchemaDao.class); + public RdbSchemaDao() {} private static final MetaDBUtil db = MetaDBUtil.Instance(); - private static final Logger log = LogManager.getLogger(RdbSchemaDao.class); @Override public MetadataProto.Schema getById(long id) diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSchemaVersionDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSchemaVersionDao.java index 31c2b5bf23..259323946d 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSchemaVersionDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSchemaVersionDao.java @@ -23,7 +23,6 @@ import io.pixelsdb.pixels.common.utils.MetaDBUtil; import io.pixelsdb.pixels.daemon.MetadataProto; import io.pixelsdb.pixels.daemon.metadata.dao.ColumnDao; -import io.pixelsdb.pixels.daemon.metadata.dao.DaoFactory; import io.pixelsdb.pixels.daemon.metadata.dao.SchemaVersionDao; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -41,7 +40,9 @@ public class RdbSchemaVersionDao extends SchemaVersionDao public RdbSchemaVersionDao() {} private static final MetaDBUtil db = MetaDBUtil.Instance(); - private static final ColumnDao columnDao = DaoFactory.Instance().getColumnDao(); + + // Issue #1105: do not get columnDao from DaoFactory, otherwise it leads to recursive initialization of DaoFactory. + private static final ColumnDao columnDao = new RdbColumnDao(); @Override public MetadataProto.SchemaVersion getById(long id) diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSinglePointIndexDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSinglePointIndexDao.java index 7d0ac45349..daf9bc6953 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSinglePointIndexDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbSinglePointIndexDao.java @@ -35,10 +35,10 @@ */ public class RdbSinglePointIndexDao extends SinglePointIndexDao { - public RdbSinglePointIndexDao() { } - private static final Logger log = LogManager.getLogger(RdbSinglePointIndexDao.class); + public RdbSinglePointIndexDao() { } + private static final MetaDBUtil db = MetaDBUtil.Instance(); @Override diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbTableDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbTableDao.java index a6beaf6dd2..9748f30cf6 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbTableDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbTableDao.java @@ -34,10 +34,11 @@ */ public class RdbTableDao extends TableDao { + private static final Logger log = LogManager.getLogger(RdbTableDao.class); + public RdbTableDao() {} private static final MetaDBUtil db = MetaDBUtil.Instance(); - private static final Logger log = LogManager.getLogger(RdbTableDao.class); @Override public MetadataProto.Table getById(long id) diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbViewDao.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbViewDao.java index ad171962c6..55016abe62 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbViewDao.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/metadata/dao/impl/RdbViewDao.java @@ -34,10 +34,11 @@ */ public class RdbViewDao extends ViewDao { + private static final Logger log = LogManager.getLogger(RdbViewDao.class); + public RdbViewDao() {} private static final MetaDBUtil db = MetaDBUtil.Instance(); - private static final Logger log = LogManager.getLogger(RdbViewDao.class); @Override public MetadataProto.View getById(long id) diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/transaction/TransContextManager.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/transaction/TransContextManager.java index 66a79d1181..5a52235176 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/transaction/TransContextManager.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/transaction/TransContextManager.java @@ -22,6 +22,8 @@ import io.pixelsdb.pixels.common.transaction.TransContext; import io.pixelsdb.pixels.common.utils.ConfigFactory; import io.pixelsdb.pixels.daemon.TransProto; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.io.BufferedWriter; import java.io.File; @@ -44,15 +46,16 @@ */ public class TransContextManager { - private static TransContextManager instance; + private static final Logger log = LogManager.getLogger(TransContextManager.class); + + private static final class InstanceHolder + { + static final TransContextManager instance = new TransContextManager(); + } protected static TransContextManager Instance() { - if (instance == null) - { - instance = new TransContextManager(); - } - return instance; + return InstanceHolder.instance; } private final Map transIdToContext = new ConcurrentHashMap<>(); @@ -117,13 +120,13 @@ private void _addTransContext(TransContext context) public boolean setTransCommit(long transId) { long stamp = this.contextLock.tryOptimisticRead(); - boolean res = _setTransStatus(transId, TransProto.TransStatus.COMMIT); + boolean res = _terminateTrans(transId, TransProto.TransStatus.COMMIT); if (!this.contextLock.validate(stamp)) { stamp = this.contextLock.readLock(); try { - res = _setTransStatus(transId, TransProto.TransStatus.COMMIT); + res = _terminateTrans(transId, TransProto.TransStatus.COMMIT); } finally { @@ -143,13 +146,13 @@ public boolean setTransCommit(long transId) public boolean setTransRollback(long transId) { long stamp = this.contextLock.tryOptimisticRead(); - boolean res = _setTransStatus(transId, TransProto.TransStatus.ROLLBACK); + boolean res = _terminateTrans(transId, TransProto.TransStatus.ROLLBACK); if (!this.contextLock.validate(stamp)) { stamp = this.contextLock.readLock(); try { - res = _setTransStatus(transId, TransProto.TransStatus.ROLLBACK); + res = _terminateTrans(transId, TransProto.TransStatus.ROLLBACK); } finally { @@ -159,36 +162,31 @@ public boolean setTransRollback(long transId) return res; } - private boolean _setTransStatus(long transId, TransProto.TransStatus status) + private boolean _terminateTrans(long transId, TransProto.TransStatus status) { TransContext context = this.transIdToContext.get(transId); if (context != null) { context.setStatus(status); - return _terminateTrans(context); - } - return false; - } - - private boolean _terminateTrans(TransContext context) - { - if (context.isReadOnly()) - { - this.readOnlyConcurrency.decrementAndGet(); - this.runningReadOnlyTrans.remove(context); - } - else - { - // only clear the context of write transactions - this.transIdToContext.remove(context.getTransId()); - this.runningWriteTrans.remove(context); - String traceId = this.transIdToTraceId.remove(context.getTransId()); - if (traceId != null) + if (context.isReadOnly()) + { + this.readOnlyConcurrency.decrementAndGet(); + this.runningReadOnlyTrans.remove(context); + } + else { - this.traceIdToTransId.remove(traceId); + // only clear the context of write transactions + this.transIdToContext.remove(context.getTransId()); + this.runningWriteTrans.remove(context); + String traceId = this.transIdToTraceId.remove(context.getTransId()); + if (traceId != null) + { + this.traceIdToTransId.remove(traceId); + } } + return true; } - return true; + return false; } /** @@ -237,7 +235,8 @@ public boolean dumpTransContext(long timestamp) entry.getValue().getStatus() == TransProto.TransStatus.ROLLBACK); } catch (IOException e) { - System.err.println("An error occurred: " + e.getMessage()); + log.error("failed to dump transaction contexts", e); + return false; } return true; } diff --git a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/transaction/TransServiceImpl.java b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/transaction/TransServiceImpl.java index ce2e020bd5..0eca6b9e15 100644 --- a/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/transaction/TransServiceImpl.java +++ b/pixels-daemon/src/main/java/io/pixelsdb/pixels/daemon/transaction/TransServiceImpl.java @@ -221,7 +221,8 @@ public void commitTransBatch(TransProto.CommitTransBatchRequest request, if (TransContextManager.Instance().setTransCommit(transId)) { commitSuccess = true; - } else + } + else { allSuccess = false; responseBuilder.setErrorCode(ErrorCode.TRANS_BATCH_PARTIAL_COMMIT_FAILED); diff --git a/pixels-executor/src/main/java/io/pixelsdb/pixels/executor/aggregation/function/FunctionFactory.java b/pixels-executor/src/main/java/io/pixelsdb/pixels/executor/aggregation/function/FunctionFactory.java index 4825d6aa7a..6eb766cef5 100644 --- a/pixels-executor/src/main/java/io/pixelsdb/pixels/executor/aggregation/function/FunctionFactory.java +++ b/pixels-executor/src/main/java/io/pixelsdb/pixels/executor/aggregation/function/FunctionFactory.java @@ -28,11 +28,14 @@ */ public class FunctionFactory { - private static final FunctionFactory instance = new FunctionFactory(); + private static final class InstanceHolder + { + private static final FunctionFactory instance = new FunctionFactory(); + } public static FunctionFactory Instance() { - return instance; + return InstanceHolder.instance; } private FunctionFactory() { } diff --git a/pixels-index/pixels-index-rocksdb/src/main/java/io/pixelsdb/pixels/index/rocksdb/RocksDBFactory.java b/pixels-index/pixels-index-rocksdb/src/main/java/io/pixelsdb/pixels/index/rocksdb/RocksDBFactory.java index 0ca8e15d43..a173a4b513 100644 --- a/pixels-index/pixels-index-rocksdb/src/main/java/io/pixelsdb/pixels/index/rocksdb/RocksDBFactory.java +++ b/pixels-index/pixels-index-rocksdb/src/main/java/io/pixelsdb/pixels/index/rocksdb/RocksDBFactory.java @@ -34,9 +34,7 @@ public class RocksDBFactory private static RocksDB instance; private static String dbPath; - private RocksDBFactory() - { - } + private RocksDBFactory() { } private static RocksDB createRocksDB(String path) throws RocksDBException { diff --git a/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsParser.java b/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsParser.java index 5c3fe65453..4dc75e3550 100644 --- a/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsParser.java +++ b/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsParser.java @@ -65,7 +65,6 @@ public class PixelsParser private final MetadataService metadataService; private final SqlParser.Config parserConfig; - private final RexBuilder rexBuilder; private final CalciteSchema schema; private final String schemaName; private final CalciteCatalogReader catalogReader; @@ -81,7 +80,7 @@ public PixelsParser(MetadataService ms, this.metadataService = ms; this.parserConfig = parserConfig; SqlTypeFactoryImpl typeFactory = new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT); - this.rexBuilder = new RexBuilder(typeFactory); + RexBuilder rexBuilder = new RexBuilder(typeFactory); this.schema = CalciteSchema.createRootSchema(true); this.schema.add(schemaName, new PixelsSchema(schemaName, metadataService)); diff --git a/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsSchemaFactory.java b/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsSchemaFactory.java index 2febaa2136..df682e0e46 100644 --- a/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsSchemaFactory.java +++ b/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsSchemaFactory.java @@ -36,13 +36,12 @@ public class PixelsSchemaFactory implements SchemaFactory public PixelsSchemaFactory(MetadataService metadataService) { - this.metadataService = metadataService; + PixelsSchemaFactory.metadataService = metadataService; } @Override - public Schema create( - SchemaPlus parentSchema, String name, Map operand) + public Schema create(SchemaPlus parentSchema, String name, Map operand) { - return new PixelsSchema(name, this.metadataService); + return new PixelsSchema(name, metadataService); } } diff --git a/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsTable.java b/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsTable.java index 46af3e70e4..9f4ee4656e 100644 --- a/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsTable.java +++ b/pixels-parser/src/main/java/io/pixelsdb/pixels/parser/PixelsTable.java @@ -94,13 +94,12 @@ private RelDataType pixelsType(Column column, RelDataTypeFactory typeFactory) th TypeDescription.Category category = typeDesc.getCategory(); SqlTypeName typeName= toSqlTypeName(category); - RelDataType sqlType = typeName.allowsPrecScale(true, true) + + return typeName.allowsPrecScale(true, true) ? typeFactory.createSqlType(typeName, typeDesc.getPrecision(), typeDesc.getScale()) : typeName.allowsPrecScale(true, false) ? typeFactory.createSqlType(typeName, typeDesc.getPrecision()) : typeFactory.createSqlType(typeName); - - return sqlType; } private static SqlTypeName toSqlTypeName(TypeDescription.Category category) { diff --git a/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/coordinate/CFWorkerManager.java b/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/coordinate/CFWorkerManager.java index 4cebe955ba..dafc5e366a 100644 --- a/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/coordinate/CFWorkerManager.java +++ b/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/coordinate/CFWorkerManager.java @@ -31,11 +31,14 @@ */ public class CFWorkerManager { - private static final CFWorkerManager instance = new CFWorkerManager(); + private static final class InstanceHolder + { + private static final CFWorkerManager instance = new CFWorkerManager(); + } public static CFWorkerManager Instance() { - return instance; + return InstanceHolder.instance; } private final Map> workerIdToWorker; diff --git a/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/coordinate/PlanCoordinatorFactory.java b/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/coordinate/PlanCoordinatorFactory.java index 4337ac1b48..71e9470305 100644 --- a/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/coordinate/PlanCoordinatorFactory.java +++ b/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/coordinate/PlanCoordinatorFactory.java @@ -31,11 +31,14 @@ */ public class PlanCoordinatorFactory { - private static final PlanCoordinatorFactory instance = new PlanCoordinatorFactory(); + private static final class InstanceHolder + { + private static final PlanCoordinatorFactory instance = new PlanCoordinatorFactory(); + } public static PlanCoordinatorFactory Instance() { - return instance; + return InstanceHolder.instance; } private final Map transIdToPlanCoordinator; diff --git a/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/plan/PlanOptimizer.java b/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/plan/PlanOptimizer.java index b2464a7a98..3d533e4fc1 100644 --- a/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/plan/PlanOptimizer.java +++ b/pixels-planner/src/main/java/io/pixelsdb/pixels/planner/plan/PlanOptimizer.java @@ -54,11 +54,15 @@ public class PlanOptimizer { private static final Logger logger = LogManager.getLogger(PlanOptimizer.class); - private static final PlanOptimizer instance = new PlanOptimizer(); + + private static final class InstanceHolder + { + private static final PlanOptimizer instance = new PlanOptimizer(); + } public static PlanOptimizer Instance() { - return instance; + return InstanceHolder.instance; } private final MetadataService metadataService; diff --git a/pixels-retina/src/main/java/io/pixelsdb/pixels/retina/MinioManager.java b/pixels-retina/src/main/java/io/pixelsdb/pixels/retina/MinioManager.java index 091ee97b0c..72b6c62134 100644 --- a/pixels-retina/src/main/java/io/pixelsdb/pixels/retina/MinioManager.java +++ b/pixels-retina/src/main/java/io/pixelsdb/pixels/retina/MinioManager.java @@ -35,6 +35,7 @@ public class MinioManager { private final Storage minio; private final String minioPathPrefix; + public MinioManager() { ConfigFactory configFactory = ConfigFactory.Instance(); @@ -52,15 +53,14 @@ public MinioManager() this.minioPathPrefix = configFactory.getProperty("minio.path.prefix"); } - private static MinioManager instance = null; + private static final class InstanceHolder + { + private static final MinioManager instance = new MinioManager(); + } public static MinioManager Instance() { - if (instance == null) - { - instance = new MinioManager(); - } - return instance; + return InstanceHolder.instance; } private String buildKey(long tableId, long entryId) diff --git a/pixels-retina/src/main/java/io/pixelsdb/pixels/retina/RetinaResourceManager.java b/pixels-retina/src/main/java/io/pixelsdb/pixels/retina/RetinaResourceManager.java index 3ebfaf3fc3..de957f2560 100644 --- a/pixels-retina/src/main/java/io/pixelsdb/pixels/retina/RetinaResourceManager.java +++ b/pixels-retina/src/main/java/io/pixelsdb/pixels/retina/RetinaResourceManager.java @@ -58,15 +58,14 @@ private RetinaResourceManager() this.pixelsWriterBufferMap = new ConcurrentHashMap<>(); } - private static RetinaResourceManager instance = null; + private static final class InstanceHolder + { + private static final RetinaResourceManager instance = new RetinaResourceManager(); + } public static RetinaResourceManager Instance() { - if (instance == null) - { - instance = new RetinaResourceManager(); - } - return instance; + return InstanceHolder.instance; } public void addVisibility(long fileId, int rgId, int recordNum) diff --git a/pixels-turbo/pixels-invoker-lambda/src/main/java/io/pixelsdb/pixels/invoker/lambda/Lambda.java b/pixels-turbo/pixels-invoker-lambda/src/main/java/io/pixelsdb/pixels/invoker/lambda/Lambda.java index d3e7b4bd8a..a63f1a9d71 100644 --- a/pixels-turbo/pixels-invoker-lambda/src/main/java/io/pixelsdb/pixels/invoker/lambda/Lambda.java +++ b/pixels-turbo/pixels-invoker-lambda/src/main/java/io/pixelsdb/pixels/invoker/lambda/Lambda.java @@ -30,11 +30,14 @@ */ public class Lambda { - private static final Lambda instance = new Lambda(); + private static final class InstanceHolder + { + private static final Lambda instance = new Lambda(); + } public static Lambda Instance() { - return instance; + return InstanceHolder.instance; } private final LambdaAsyncClient asyncClient; diff --git a/pixels-turbo/pixels-invoker-spike/src/main/java/io/pixelsdb/pixels/invoker/spike/SpikeAsyncClient.java b/pixels-turbo/pixels-invoker-spike/src/main/java/io/pixelsdb/pixels/invoker/spike/SpikeAsyncClient.java index 43a4d8cf5c..f818cbb8b1 100644 --- a/pixels-turbo/pixels-invoker-spike/src/main/java/io/pixelsdb/pixels/invoker/spike/SpikeAsyncClient.java +++ b/pixels-turbo/pixels-invoker-spike/src/main/java/io/pixelsdb/pixels/invoker/spike/SpikeAsyncClient.java @@ -33,7 +33,12 @@ public class SpikeAsyncClient { private static final ConfigFactory config = ConfigFactory.Instance(); - private static SpikeAsyncClient instance; + + private static final class InstanceHolder + { + private static final SpikeAsyncClient instance = new SpikeAsyncClient(); + } + private final ManagedChannel channel; private final SpikeServiceGrpc.SpikeServiceFutureStub stub; private final int cpu; @@ -54,13 +59,9 @@ private SpikeAsyncClient() this.stub = SpikeServiceGrpc.newFutureStub(channel); } - public static synchronized SpikeAsyncClient getInstance() + public static synchronized SpikeAsyncClient Instance() { - if (instance == null) - { - instance = new SpikeAsyncClient(); - } - return instance; + return InstanceHolder.instance; } @Override diff --git a/pixels-turbo/pixels-invoker-spike/src/main/java/io/pixelsdb/pixels/invoker/spike/SpikeInvoker.java b/pixels-turbo/pixels-invoker-spike/src/main/java/io/pixelsdb/pixels/invoker/spike/SpikeInvoker.java index 2112fd1a73..8fff1eae81 100644 --- a/pixels-turbo/pixels-invoker-spike/src/main/java/io/pixelsdb/pixels/invoker/spike/SpikeInvoker.java +++ b/pixels-turbo/pixels-invoker-spike/src/main/java/io/pixelsdb/pixels/invoker/spike/SpikeInvoker.java @@ -79,7 +79,7 @@ public CompletableFuture invoke(Input input) { SpikeWorkerRequest workerRequest = new SpikeWorkerRequest(this.workerType, JSON.toJSONString(input, SerializerFeature.DisableCircularReferenceDetect)); - ListenableFuture future = SpikeAsyncClient.getInstance().invoke( + ListenableFuture future = SpikeAsyncClient.Instance().invoke( this.functionName, JSON.toJSONString(workerRequest, SerializerFeature.DisableCircularReferenceDetect), input.getRequiredCpu(), input.getRequiredMemory()); diff --git a/pixels-turbo/pixels-invoker-vhive/src/main/java/io/pixelsdb/pixels/invoker/vhive/ScanInvoker.java b/pixels-turbo/pixels-invoker-vhive/src/main/java/io/pixelsdb/pixels/invoker/vhive/ScanInvoker.java index edd2cd9b98..d197774d18 100644 --- a/pixels-turbo/pixels-invoker-vhive/src/main/java/io/pixelsdb/pixels/invoker/vhive/ScanInvoker.java +++ b/pixels-turbo/pixels-invoker-vhive/src/main/java/io/pixelsdb/pixels/invoker/vhive/ScanInvoker.java @@ -26,15 +26,11 @@ import io.pixelsdb.pixels.planner.plan.physical.input.ScanInput; import io.pixelsdb.pixels.planner.plan.physical.output.ScanOutput; import io.pixelsdb.pixels.turbo.TurboProto; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import java.util.concurrent.CompletableFuture; public class ScanInvoker extends VhiveInvoker { - private final Logger log = LogManager.getLogger(ScanInvoker.class); - protected ScanInvoker(String functionName) { super(functionName); @@ -49,7 +45,6 @@ public Output parseOutput(String outputJson) @Override public CompletableFuture invoke(Input input) { -// log.info(String.format("invoke ScanInput: %s", JSON.toJSONString(input, SerializerFeature.PrettyFormat, SerializerFeature.DisableCircularReferenceDetect))); ListenableFuture future = Vhive.Instance().getAsyncClient().scan((ScanInput) input); return genCompletableFuture(future); } diff --git a/pixels-turbo/pixels-invoker-vhive/src/main/java/io/pixelsdb/pixels/invoker/vhive/Vhive.java b/pixels-turbo/pixels-invoker-vhive/src/main/java/io/pixelsdb/pixels/invoker/vhive/Vhive.java index bcc9dfa1e7..ac036cdea5 100644 --- a/pixels-turbo/pixels-invoker-vhive/src/main/java/io/pixelsdb/pixels/invoker/vhive/Vhive.java +++ b/pixels-turbo/pixels-invoker-vhive/src/main/java/io/pixelsdb/pixels/invoker/vhive/Vhive.java @@ -24,7 +24,12 @@ public class Vhive { private static final ConfigFactory config = ConfigFactory.Instance(); - private static final Vhive instance = new Vhive(); + + private static final class InstanceHolder + { + private static final Vhive instance = new Vhive(); + } + private final WorkerAsyncClient asyncClient; private Vhive() @@ -36,7 +41,7 @@ private Vhive() public static Vhive Instance() { - return instance; + return InstanceHolder.instance; } public WorkerAsyncClient getAsyncClient() diff --git a/pixels-turbo/pixels-scaling-ec2/src/main/java/io/pixelsdb/pixels/scaling/ec2/CloudWatch.java b/pixels-turbo/pixels-scaling-ec2/src/main/java/io/pixelsdb/pixels/scaling/ec2/CloudWatch.java index 07faa4f86f..e217495f66 100644 --- a/pixels-turbo/pixels-scaling-ec2/src/main/java/io/pixelsdb/pixels/scaling/ec2/CloudWatch.java +++ b/pixels-turbo/pixels-scaling-ec2/src/main/java/io/pixelsdb/pixels/scaling/ec2/CloudWatch.java @@ -27,11 +27,14 @@ */ public class CloudWatch { - private static final CloudWatch instance = new CloudWatch(); + private static final class InstanceHolder + { + private static final CloudWatch instance = new CloudWatch(); + } public static CloudWatch Instance() { - return instance; + return InstanceHolder.instance; } private final CloudWatchClient client; diff --git a/pixels-turbo/pixels-worker-vhive/src/main/java/io/pixelsdb/pixels/worker/vhive/Main.java b/pixels-turbo/pixels-worker-vhive/src/main/java/io/pixelsdb/pixels/worker/vhive/Main.java index 5a0f4616ff..b40d1f112f 100644 --- a/pixels-turbo/pixels-worker-vhive/src/main/java/io/pixelsdb/pixels/worker/vhive/Main.java +++ b/pixels-turbo/pixels-worker-vhive/src/main/java/io/pixelsdb/pixels/worker/vhive/Main.java @@ -38,7 +38,7 @@ public static void main(String[] args) .build()); CommandLineParser parser = new DefaultParser(); - CommandLine cmd = null; + CommandLine cmd; try { cmd = parser.parse(options, args); @@ -54,6 +54,5 @@ public static void main(String[] args) formatter.printHelp("Log messages to sequence diagrams converter", options); System.exit(1); } - } } diff --git a/pixels-turbo/pixels-worker-vhive/src/main/java/io/pixelsdb/pixels/worker/vhive/utils/ServiceImpl.java b/pixels-turbo/pixels-worker-vhive/src/main/java/io/pixelsdb/pixels/worker/vhive/utils/ServiceImpl.java index 26f5f828d7..1c96fee316 100644 --- a/pixels-turbo/pixels-worker-vhive/src/main/java/io/pixelsdb/pixels/worker/vhive/utils/ServiceImpl.java +++ b/pixels-turbo/pixels-worker-vhive/src/main/java/io/pixelsdb/pixels/worker/vhive/utils/ServiceImpl.java @@ -41,9 +41,7 @@ public class ServiceImpl, I extends Input, O exte final Class handlerClass; final Class typeParameterClass; - public ServiceImpl( - Class handlerClass, - Class typeParameterClass) + public ServiceImpl(Class handlerClass, Class typeParameterClass) { this.handlerClass = handlerClass; this.typeParameterClass = typeParameterClass;