| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.twitter.distributedlog; |
| |
| import com.google.common.base.Optional; |
| import com.twitter.distributedlog.acl.AccessControlManager; |
| import com.twitter.distributedlog.callback.NamespaceListener; |
| import com.twitter.distributedlog.config.DynamicDistributedLogConfiguration; |
| import com.twitter.distributedlog.exceptions.InvalidStreamNameException; |
| import com.twitter.distributedlog.namespace.DistributedLogNamespace; |
| import org.apache.bookkeeper.stats.NullStatsLogger; |
| import org.apache.bookkeeper.stats.StatsLogger; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| import java.io.IOException; |
| import java.net.URI; |
| import java.util.Collection; |
| import java.util.Map; |
| |
| /** |
| * This is the legacy way to access bookkeeper based distributedlog namespace. |
| * Use {@link DistributedLogNamespace} to manage logs instead if you could. |
| */ |
| @Deprecated |
| public class DistributedLogManagerFactory { |
| static final Logger LOG = LoggerFactory.getLogger(DistributedLogManagerFactory.class); |
| |
| public static enum ClientSharingOption { |
| PerStreamClients, |
| SharedZKClientPerStreamBKClient, |
| SharedClients |
| } |
| |
| private final BKDistributedLogNamespace namespace; |
| |
| public DistributedLogManagerFactory(DistributedLogConfiguration conf, URI uri) |
| throws IOException, IllegalArgumentException { |
| this(conf, uri, NullStatsLogger.INSTANCE); |
| } |
| |
| public DistributedLogManagerFactory(DistributedLogConfiguration conf, URI uri, |
| StatsLogger statsLogger) |
| throws IOException, IllegalArgumentException { |
| this(conf, |
| uri, |
| statsLogger, |
| DistributedLogConstants.UNKNOWN_CLIENT_ID, |
| DistributedLogConstants.LOCAL_REGION_ID); |
| } |
| |
| public DistributedLogManagerFactory(DistributedLogConfiguration conf, |
| URI uri, |
| StatsLogger statsLogger, |
| String clientId, |
| int regionId) |
| throws IOException, IllegalArgumentException { |
| this.namespace = BKDistributedLogNamespace.newBuilder() |
| .conf(conf) |
| .uri(uri) |
| .statsLogger(statsLogger) |
| .clientId(clientId) |
| .regionId(regionId) |
| .build(); |
| } |
| |
| public DistributedLogNamespace getNamespace() { |
| return namespace; |
| } |
| |
| public void registerNamespaceListener(NamespaceListener listener) { |
| namespace.registerNamespaceListener(listener); |
| } |
| |
| /** |
| * Create a DistributedLogManager for <i>nameOfLogStream</i>, with default shared clients. |
| * |
| * @param nameOfLogStream |
| * name of log stream |
| * @return distributedlog manager |
| * @throws com.twitter.distributedlog.exceptions.InvalidStreamNameException if stream name is invalid |
| * @throws IOException |
| */ |
| public DistributedLogManager createDistributedLogManagerWithSharedClients(String nameOfLogStream) |
| throws InvalidStreamNameException, IOException { |
| return createDistributedLogManager(nameOfLogStream, ClientSharingOption.SharedClients); |
| } |
| |
| /** |
| * Create a DistributedLogManager for <i>nameOfLogStream</i>, with specified client sharing options. |
| * |
| * @param nameOfLogStream |
| * name of log stream. |
| * @param clientSharingOption |
| * specifies if the ZK/BK clients are shared |
| * @return distributedlog manager instance. |
| * @throws com.twitter.distributedlog.exceptions.InvalidStreamNameException if stream name is invalid |
| * @throws IOException |
| */ |
| public DistributedLogManager createDistributedLogManager( |
| String nameOfLogStream, |
| ClientSharingOption clientSharingOption) |
| throws InvalidStreamNameException, IOException { |
| Optional<DistributedLogConfiguration> streamConfiguration = Optional.absent(); |
| Optional<DynamicDistributedLogConfiguration> dynamicStreamConfiguration = Optional.absent(); |
| return createDistributedLogManager(nameOfLogStream, |
| clientSharingOption, |
| streamConfiguration, |
| dynamicStreamConfiguration); |
| } |
| |
| /** |
| * Create a DistributedLogManager for <i>nameOfLogStream</i>, with specified client sharing options. |
| * This method allows the caller to override global configuration options by supplying stream |
| * configuration overrides. Stream config overrides come in two flavors, static and dynamic. Static |
| * config never changes, and DynamicDistributedLogConfiguration is a) reloaded periodically and |
| * b) safe to access from any context. |
| * |
| * @param nameOfLogStream |
| * name of log stream. |
| * @param clientSharingOption |
| * specifies if the ZK/BK clients are shared |
| * @param streamConfiguration |
| * stream configuration overrides. |
| * @param dynamicStreamConfiguration |
| * dynamic stream configuration overrides. |
| * @return distributedlog manager instance. |
| * @throws com.twitter.distributedlog.exceptions.InvalidStreamNameException if stream name is invalid |
| * @throws IOException |
| */ |
| public DistributedLogManager createDistributedLogManager( |
| String nameOfLogStream, |
| ClientSharingOption clientSharingOption, |
| Optional<DistributedLogConfiguration> streamConfiguration, |
| Optional<DynamicDistributedLogConfiguration> dynamicStreamConfiguration) |
| throws InvalidStreamNameException, IOException { |
| return namespace.createDistributedLogManager( |
| nameOfLogStream, |
| clientSharingOption, |
| streamConfiguration, |
| dynamicStreamConfiguration); |
| } |
| |
| public MetadataAccessor createMetadataAccessor(String nameOfMetadataNode) |
| throws InvalidStreamNameException, IOException { |
| return namespace.createMetadataAccessor(nameOfMetadataNode); |
| } |
| |
| public synchronized AccessControlManager createAccessControlManager() throws IOException { |
| return namespace.createAccessControlManager(); |
| } |
| |
| public boolean checkIfLogExists(String nameOfLogStream) |
| throws IOException, IllegalArgumentException { |
| return namespace.logExists(nameOfLogStream); |
| } |
| |
| public Collection<String> enumerateAllLogsInNamespace() |
| throws IOException, IllegalArgumentException { |
| return namespace.enumerateAllLogsInNamespace(); |
| } |
| |
| public Map<String, byte[]> enumerateLogsWithMetadataInNamespace() |
| throws IOException, IllegalArgumentException { |
| return namespace.enumerateLogsWithMetadataInNamespace(); |
| } |
| |
| /** |
| * This method is to initialize the metadata for a unpartitioned stream with name <i>streamName</i>. |
| * |
| * TODO: after 0.2 is upgraded to 0.3, remove this. |
| * |
| * @param streamName |
| * stream name. |
| * @throws IOException |
| */ |
| public void createUnpartitionedStream(final String streamName) throws IOException { |
| namespace.createLog(streamName); |
| } |
| |
| /** |
| * Close the distributed log manager factory, freeing any resources it may hold. |
| */ |
| public void close() { |
| namespace.close(); |
| } |
| } |