Package com.linkedin.venice.utils
Class Utils
- java.lang.Object
-
- com.linkedin.venice.utils.Utils
-
public class Utils extends java.lang.Object
Helper functions
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
Utils.ConfigEntity<T>
This class encapsulates config entity information such as config name, default value, config document
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
FATAL_DATA_VALIDATION_ERROR
static java.lang.String
NEW_LINE_CHAR
static java.lang.String
SEPARATE_TOPIC_SUFFIX
static java.util.concurrent.atomic.AtomicBoolean
SUPPRESS_SYSTEM_EXIT
static java.lang.String
WILDCARD_MATCH_ANY
-
Constructor Summary
Constructors Constructor Description Utils()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static void
closeQuietlyWithErrorLogged(java.io.Closeable... closeables)
static java.lang.String
composeRealTimeTopic(java.lang.String storeName)
This method should only be used for system stores.static <T> void
computeIfNotNull(T t, java.util.function.Consumer<T> function)
Run "function" on "t" if "t" is not nullstatic boolean
directoryExists(java.lang.String dataDirectory)
static java.lang.String
escapeFilePathComponent(java.lang.String component)
Method to escape file path component to make it a valid file path string/substring.static void
exit(java.lang.String message)
Print an error and exit with error code 1static void
exit(java.lang.String message, int exitCode)
Print an error and exit with the given error codestatic java.util.Map<java.lang.String,java.lang.String>
extractQueryParamsFromRequest(java.util.Map<java.lang.String,java.lang.String[]> sparkRequestParams, ControllerResponse response)
static java.util.Map<java.lang.Integer,org.apache.avro.Schema>
getAllSchemasFromResources(AvroProtocolDefinition protocolDef)
static java.lang.String
getCanonicalPath(java.lang.String fileName)
Get the full Path of the file.static java.lang.String
getCurrentUser()
static java.lang.String
getCurrentWorkingDirectory()
static java.util.Map<java.lang.CharSequence,java.lang.CharSequence>
getDebugInfo()
static java.lang.String
getHelixNodeIdentifier(java.lang.String hostname, int port)
static java.lang.String
getHostName()
Get the node's host name.static int
getJavaMajorVersion()
static java.lang.String
getPid()
Note: this may fail in some JVM implementations.static java.lang.String
getRealTimeTopicName(Store store)
It follows the following order to search for real time topic name, i) current store-version config, ii) store config, iii) other store-version configs, iv) default namestatic java.lang.String
getRealTimeTopicName(StoreInfo storeInfo)
static java.lang.String
getRealTimeTopicName(Version version)
static java.lang.String
getReplicaId(PubSubTopicPartition topicPartition)
Standard logging format for TopicPartitionstatic java.lang.String
getReplicaId(PubSubTopic topic, int partition)
static java.lang.String
getReplicaId(java.lang.String topic, int partition)
static java.util.List<Replica>
getReplicasForInstance(RoutingDataRepository routingDataRepo, java.lang.String instanceId)
static java.lang.String
getSanitizedStringForLogger(java.lang.String orig)
Log4J's class name logging splits at the last "." and assumes it is the class name.static org.apache.avro.Schema
getSchemaFromResource(java.lang.String resourcePath)
Utility function to get schemas out of embedded resources.static java.io.File
getTempDataDirectory()
static java.io.File
getTempDataDirectory(java.lang.String prefix)
static java.lang.String
getUniqueString()
static java.lang.String
getUniqueString(java.lang.String prefix)
static java.lang.String
getUniqueTempPath()
static java.lang.String
getUniqueTempPath(java.lang.String prefix)
static java.util.Optional<java.lang.CharSequence>
getValueFromCharSequenceMapWithStringKey(java.util.Map<java.lang.CharSequence,java.lang.CharSequence> charSequenceMap, java.lang.String stringKey)
Given a key with typeString
and get a value (if there is one) from a map of typeMap
which has one of key's toString value equals to the given String key.static java.lang.String
getVeniceVersionFromClassPath()
This might not work when application is running inside application server like Jettystatic boolean
isCurrentVersion(java.lang.String resourceName, ReadOnlyStoreRepository metadataRepo)
static boolean
isExtraReplica(ReadOnlyStoreRepository metadataRepo, Replica replica, java.util.List<Instance> readyInstances)
When Helix thinks some host is overloaded or a new host joins the cluster, it might move some replicas from one host to another.static boolean
isFutureVersion(java.lang.String resourceName, ReadOnlyStoreRepository metadataRepo)
static boolean
isReadableDir(java.io.File d)
Check if a directory exists and is readablestatic boolean
isReadableDir(java.lang.String dirName)
Check if a directory exists and is readablestatic boolean
isReadableFile(java.io.File f)
Check if a file exists and is readablestatic boolean
isReadableFile(java.lang.String fileName)
Check if a file exists and is readablestatic boolean
isSeparateTopicRegion(java.lang.String region)
Check whether input region is for separate RT topic.static <K,V>
java.util.Iterator<V>iterateOnMapOfLists(java.util.Map<K,java.util.List<V>> mapOfLists)
static java.lang.String
makeLargeNumberPretty(long largeNumber)
static java.lang.String
makeTimePretty(long nanoSecTime)
static <T> java.util.Set<T>
mutableSetOf(T... objs)
static boolean
parseBooleanFromString(java.lang.String value, java.lang.String fieldName)
SinceBoolean.parseBoolean(String)
does not throw exception and will always return 'false' for any string that are not equal to 'true', We validate the string by our own.static java.util.List<java.lang.String>
parseCommaSeparatedStringToList(java.lang.String rawString)
static java.util.Set<java.lang.String>
parseCommaSeparatedStringToSet(java.lang.String rawString)
static long
parseDateTimeToEpoch(java.lang.String dateTime, java.lang.String dateTimeFormat, java.lang.String timeZone)
Parses a date-time string to epoch milliseconds using the default format and time zone.static java.lang.String
parseHostFromHelixNodeIdentifier(java.lang.String nodeId)
static int
parseIntFromString(java.lang.String value, java.lang.String fieldName)
static java.util.Map<java.lang.String,java.lang.String>
parseJsonMapFromString(java.lang.String value, java.lang.String fieldName)
For String-String key-value map config, we expect the command-line interface users to use JSON format to represent it.static long
parseLongFromString(java.lang.String value, java.lang.String fieldName)
static int
parsePortFromHelixNodeIdentifier(java.lang.String nodeId)
static VeniceProperties
parseProperties(java.io.File propertyFile)
Given a .property file, reads into a Venice Props objectstatic VeniceProperties
parseProperties(java.lang.String configFileName)
Given a filePath, reads into a Venice Props objectstatic VeniceProperties
parseProperties(java.lang.String directory, java.lang.String fileName, boolean isFileOptional)
Generate VeniceProperties object from a given directory, file.static java.lang.String
resolveKafkaUrlForSepTopic(java.lang.String kafkaUrl)
Check whether the given kafka url has "_sep" or not.static PubSubTopic
resolveLeaderTopicFromPubSubTopic(PubSubTopicRepository pubSubTopicRepository, PubSubTopic pubSubTopic)
Resolve leader topic from input topic.static double
round(double value, int precision)
static <T> java.util.Set<T>
setOf(T... objs)
static boolean
sleep(long millis)
Sleep until number of milliseconds have passed, or the operation is interrupted.static void
thisIsLocalhost()
The ssl certificate we have for unit tests has the hostname "localhost".static boolean
verifyTransition(ExecutionStatus newStatus, ExecutionStatus... allowed)
Verify that is the new status allowed to be used.static Pair<Store,Version>
waitStoreVersionOrThrow(java.lang.String storeVersionName, ReadOnlyStoreRepository metadataRepo)
-
-
-
Field Detail
-
WILDCARD_MATCH_ANY
public static final java.lang.String WILDCARD_MATCH_ANY
- See Also:
- Constant Field Values
-
NEW_LINE_CHAR
public static final java.lang.String NEW_LINE_CHAR
-
SUPPRESS_SYSTEM_EXIT
public static final java.util.concurrent.atomic.AtomicBoolean SUPPRESS_SYSTEM_EXIT
-
SEPARATE_TOPIC_SUFFIX
public static final java.lang.String SEPARATE_TOPIC_SUFFIX
- See Also:
- Constant Field Values
-
FATAL_DATA_VALIDATION_ERROR
public static final java.lang.String FATAL_DATA_VALIDATION_ERROR
- See Also:
- Constant Field Values
-
-
Method Detail
-
exit
public static void exit(java.lang.String message)
Print an error and exit with error code 1- Parameters:
message
- The error to print
-
exit
public static void exit(java.lang.String message, int exitCode)
Print an error and exit with the given error code- Parameters:
message
- The error to printexitCode
- The error code to exit with
-
computeIfNotNull
public static <T> void computeIfNotNull(T t, java.util.function.Consumer<T> function)
Run "function" on "t" if "t" is not null
-
parseProperties
public static VeniceProperties parseProperties(java.lang.String configFileName) throws java.io.IOException
Given a filePath, reads into a Venice Props object- Parameters:
configFileName
- - String path to a properties file- Returns:
- A @Props object with the given configurations
- Throws:
java.io.IOException
-
parseProperties
public static VeniceProperties parseProperties(java.lang.String directory, java.lang.String fileName, boolean isFileOptional) throws java.io.IOException
Generate VeniceProperties object from a given directory, file.- Parameters:
directory
- directory that contains the Property filefileName
- fileName of the Property fileisFileOptional
- set this to true if the file is optional. If file is missing and set to true, empty property will be returned. If file is missing and set to false, this will throw an exception.- Throws:
java.io.IOException
-
parseProperties
public static VeniceProperties parseProperties(java.io.File propertyFile) throws java.io.IOException
Given a .property file, reads into a Venice Props object- Parameters:
propertyFile
- The .property file- Returns:
- A @Props object with the given properties
- Throws:
java.io.IOException
- if File not found or not accessible
-
isReadableDir
public static boolean isReadableDir(java.io.File d)
Check if a directory exists and is readable- Parameters:
d
- The directory- Returns:
- true iff the argument is a readable directory
-
isReadableDir
public static boolean isReadableDir(java.lang.String dirName)
Check if a directory exists and is readable- Parameters:
dirName
- The directory name- Returns:
- true iff the argument is the name of a readable directory
-
isReadableFile
public static boolean isReadableFile(java.lang.String fileName)
Check if a file exists and is readable- Returns:
- true iff the argument is the name of a readable file
-
isReadableFile
public static boolean isReadableFile(java.io.File f)
Check if a file exists and is readable- Parameters:
f
- The file- Returns:
- true iff the argument is a readable file
-
getCanonicalPath
public static java.lang.String getCanonicalPath(java.lang.String fileName)
Get the full Path of the file. Useful in logging/error output- Returns:
- canonicalPath of the file.
-
directoryExists
public static boolean directoryExists(java.lang.String dataDirectory)
-
thisIsLocalhost
public static void thisIsLocalhost()
The ssl certificate we have for unit tests has the hostname "localhost". Any tests that rely on this certificate require that the hostname of the machine match the hostname of the certificate. This method lets us globally assert that the hostname for the machine should resolve to "localhost". We can call this method at the start of any tests that require hostnames to resolve to "localhost" It's not ideal to put this as state in a Utils class, we can revisit if we come up with a better way to do it
-
getHostName
public static java.lang.String getHostName()
Get the node's host name.- Returns:
- current node's host name.
-
sleep
public static boolean sleep(long millis)
Sleep until number of milliseconds have passed, or the operation is interrupted. This method will swallow the InterruptedException and terminate, if this is used in a loop it may become difficult to cleanly break out of the loop.- Returns:
- true on success and false if sleep was interrupted
-
parseIntFromString
public static int parseIntFromString(java.lang.String value, java.lang.String fieldName)
-
parseLongFromString
public static long parseLongFromString(java.lang.String value, java.lang.String fieldName)
-
parseBooleanFromString
public static boolean parseBooleanFromString(java.lang.String value, java.lang.String fieldName)
SinceBoolean.parseBoolean(String)
does not throw exception and will always return 'false' for any string that are not equal to 'true', We validate the string by our own.
-
parseJsonMapFromString
public static java.util.Map<java.lang.String,java.lang.String> parseJsonMapFromString(java.lang.String value, java.lang.String fieldName)
For String-String key-value map config, we expect the command-line interface users to use JSON format to represent it. This method deserialize it to String-String map.
-
getHelixNodeIdentifier
public static java.lang.String getHelixNodeIdentifier(java.lang.String hostname, int port)
-
parseHostFromHelixNodeIdentifier
public static java.lang.String parseHostFromHelixNodeIdentifier(java.lang.String nodeId)
-
parsePortFromHelixNodeIdentifier
public static int parsePortFromHelixNodeIdentifier(java.lang.String nodeId)
-
getSchemaFromResource
public static org.apache.avro.Schema getSchemaFromResource(java.lang.String resourcePath) throws java.io.IOException
Utility function to get schemas out of embedded resources.- Parameters:
resourcePath
- The path of the file under the src/main/resources directory- Returns:
- the
Schema
instance corresponding to the file at {@param resourcePath} - Throws:
java.io.IOException
- if the resourcePath does not exist
-
getAllSchemasFromResources
public static java.util.Map<java.lang.Integer,org.apache.avro.Schema> getAllSchemasFromResources(AvroProtocolDefinition protocolDef)
-
verifyTransition
public static boolean verifyTransition(ExecutionStatus newStatus, ExecutionStatus... allowed)
Verify that is the new status allowed to be used.
-
parseCommaSeparatedStringToSet
public static java.util.Set<java.lang.String> parseCommaSeparatedStringToSet(java.lang.String rawString)
-
parseCommaSeparatedStringToList
public static java.util.List<java.lang.String> parseCommaSeparatedStringToList(java.lang.String rawString)
-
round
public static double round(double value, int precision)
- Parameters:
value
- the double value to be roundedprecision
- the number of decimal places by which to round- Returns:
- {@param value} rounded by {@param precision} decimal places
-
makeLargeNumberPretty
public static java.lang.String makeLargeNumberPretty(long largeNumber)
-
getUniqueString
public static java.lang.String getUniqueString()
-
getUniqueString
public static java.lang.String getUniqueString(java.lang.String prefix)
-
getUniqueTempPath
public static java.lang.String getUniqueTempPath()
-
getUniqueTempPath
public static java.lang.String getUniqueTempPath(java.lang.String prefix)
-
getTempDataDirectory
public static java.io.File getTempDataDirectory()
-
getTempDataDirectory
public static java.io.File getTempDataDirectory(java.lang.String prefix)
-
composeRealTimeTopic
public static java.lang.String composeRealTimeTopic(java.lang.String storeName)
This method should only be used for system stores. For other stores, usegetRealTimeTopicName(Store)
,getRealTimeTopicName(StoreInfo)
orgetRealTimeTopicName(Version)
-
getRealTimeTopicName
public static java.lang.String getRealTimeTopicName(Store store)
It follows the following order to search for real time topic name, i) current store-version config, ii) store config, iii) other store-version configs, iv) default name
-
getRealTimeTopicName
public static java.lang.String getRealTimeTopicName(StoreInfo storeInfo)
-
getRealTimeTopicName
public static java.lang.String getRealTimeTopicName(Version version)
-
makeTimePretty
public static java.lang.String makeTimePretty(long nanoSecTime)
-
getCurrentWorkingDirectory
public static java.lang.String getCurrentWorkingDirectory()
-
getPid
public static java.lang.String getPid()
Note: this may fail in some JVM implementations. Lifted from: https://stackoverflow.com/a/7690178- Returns:
- the pid of the current Java process, or null if unavailable
-
getVeniceVersionFromClassPath
public static java.lang.String getVeniceVersionFromClassPath()
This might not work when application is running inside application server like Jetty- Returns:
- the version of the venice-common jar on the classpath, if available, or null otherwise.
-
getCurrentUser
public static java.lang.String getCurrentUser()
-
getJavaMajorVersion
public static int getJavaMajorVersion()
-
getDebugInfo
public static java.util.Map<java.lang.CharSequence,java.lang.CharSequence> getDebugInfo()
-
getValueFromCharSequenceMapWithStringKey
public static java.util.Optional<java.lang.CharSequence> getValueFromCharSequenceMapWithStringKey(java.util.Map<java.lang.CharSequence,java.lang.CharSequence> charSequenceMap, java.lang.String stringKey)
Given a key with typeString
and get a value (if there is one) from a map of typeMap
which has one of key's toString value equals to the given String key. Note that the worst case runtime of this function is O(n) since the given map is iterated to find the value. The reason why this function exists is that the specific implementation of theCharSequence
interface might not beString
for the map key type. So, when users try to get a value from such a map with a String key, they might not get the value even when the value of the key which has the same toString representation as the user-given String key since the specific implementation of theCharSequence
interface has a different hash function than String's hash function.- Returns:
- a Value in the CharSequence map or {@link null}
-
setOf
@SafeVarargs public static <T> java.util.Set<T> setOf(T... objs)
-
mutableSetOf
@SafeVarargs public static <T> java.util.Set<T> mutableSetOf(T... objs)
-
closeQuietlyWithErrorLogged
public static void closeQuietlyWithErrorLogged(java.io.Closeable... closeables)
-
getReplicasForInstance
public static java.util.List<Replica> getReplicasForInstance(RoutingDataRepository routingDataRepo, java.lang.String instanceId)
-
isCurrentVersion
public static boolean isCurrentVersion(java.lang.String resourceName, ReadOnlyStoreRepository metadataRepo)
-
isFutureVersion
public static boolean isFutureVersion(java.lang.String resourceName, ReadOnlyStoreRepository metadataRepo)
-
isExtraReplica
public static boolean isExtraReplica(ReadOnlyStoreRepository metadataRepo, Replica replica, java.util.List<Instance> readyInstances)
When Helix thinks some host is overloaded or a new host joins the cluster, it might move some replicas from one host to another. The partition to be moved is usually in a healthy state, i.e. 3/3 running replicas. We will now build an extra replica in the new host before dropping one replica in an old host. i.e. replica changes 3 -> 4 -> 3. In this scenario, we may see an extra replica appear. This function determines if a replica is an extra replica.- Returns:
- true, if the input replica is an extra one. false, otherwise.
-
extractQueryParamsFromRequest
public static java.util.Map<java.lang.String,java.lang.String> extractQueryParamsFromRequest(java.util.Map<java.lang.String,java.lang.String[]> sparkRequestParams, ControllerResponse response)
-
waitStoreVersionOrThrow
public static Pair<Store,Version> waitStoreVersionOrThrow(java.lang.String storeVersionName, ReadOnlyStoreRepository metadataRepo)
-
iterateOnMapOfLists
public static <K,V> java.util.Iterator<V> iterateOnMapOfLists(java.util.Map<K,java.util.List<V>> mapOfLists)
-
getSanitizedStringForLogger
public static java.lang.String getSanitizedStringForLogger(java.lang.String orig)
Log4J's class name logging splits at the last "." and assumes it is the class name. In case where custom strings (e.g. URLs, server addresses, etc.) are added to the logger names, Log4J logs an incomplete string. This function replaces "." with "_" in the string when setting as the input for the logger.- Parameters:
orig
- The string to sanitize- Returns:
- A sanitized string that won't get mutated by Log4J
-
getReplicaId
public static java.lang.String getReplicaId(PubSubTopicPartition topicPartition)
Standard logging format for TopicPartition
-
getReplicaId
public static java.lang.String getReplicaId(java.lang.String topic, int partition)
-
getReplicaId
public static java.lang.String getReplicaId(PubSubTopic topic, int partition)
-
escapeFilePathComponent
public static java.lang.String escapeFilePathComponent(java.lang.String component)
Method to escape file path component to make it a valid file path string/substring.- Parameters:
component
- file path component string- Returns:
- Escaped file path component string
-
resolveKafkaUrlForSepTopic
public static java.lang.String resolveKafkaUrlForSepTopic(java.lang.String kafkaUrl)
Check whether the given kafka url has "_sep" or not. If it has, return the kafka url without "_sep". Otherwise, return the original kafka url.- Parameters:
kafkaUrl
-- Returns:
-
isSeparateTopicRegion
public static boolean isSeparateTopicRegion(java.lang.String region)
Check whether input region is for separate RT topic.
-
resolveLeaderTopicFromPubSubTopic
public static PubSubTopic resolveLeaderTopicFromPubSubTopic(PubSubTopicRepository pubSubTopicRepository, PubSubTopic pubSubTopic)
Resolve leader topic from input topic. If input topic is separate RT topic, return the corresponding RT topic. Otherwise, return the original input topic.
-
parseDateTimeToEpoch
public static long parseDateTimeToEpoch(java.lang.String dateTime, java.lang.String dateTimeFormat, java.lang.String timeZone) throws java.text.ParseException
Parses a date-time string to epoch milliseconds using the default format and time zone.- Parameters:
dateTime
- the date-time string in the format "yyyy-MM-dd hh:mm:ss"- Returns:
- the epoch time in milliseconds
- Throws:
java.text.ParseException
- if the date-time string cannot be parsed
-
-