com.alibaba.jstorm.yarn.registry.YarnRegistryViewForProviders.java Source code

Java tutorial

Introduction

Here is the source code for com.alibaba.jstorm.yarn.registry.YarnRegistryViewForProviders.java

Source

/*
 * 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.alibaba.jstorm.yarn.registry;

import com.alibaba.jstorm.yarn.utils.JstormYarnUtils;
import com.google.common.base.Preconditions;
import org.apache.hadoop.fs.PathNotFoundException;
import org.apache.hadoop.registry.client.api.BindFlags;
import org.apache.hadoop.registry.client.api.RegistryConstants;
import org.apache.hadoop.registry.client.api.RegistryOperations;
import org.apache.hadoop.registry.client.binding.RegistryPathUtils;
import org.apache.hadoop.registry.client.binding.RegistryUtils;
import org.apache.hadoop.registry.client.types.ServiceRecord;
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;

import java.io.IOException;
import java.util.List;

import static org.apache.hadoop.registry.client.binding.RegistryPathUtils.join;

/**
 * Registry view for providers. This tracks where the service
 * is registered, offers access to the record and other things.
 */
public class YarnRegistryViewForProviders {

    private final RegistryOperations registryOperations;

    private final String user;

    private final String jstormServiceClass;
    private final String instanceName;
    private final ApplicationAttemptId applicationAttemptId;
    /**
     * Record used where the service registered itself.
     * Null until the service is registered
     */
    private ServiceRecord selfRegistration;

    /**
     * Path where record was registered
     * Null until the service is registered
     */
    private String selfRegistrationPath;

    public YarnRegistryViewForProviders(RegistryOperations registryOperations, String user,
            String jstormServiceClass, String instanceName, ApplicationAttemptId applicationAttemptId) {
        Preconditions.checkArgument(registryOperations != null, "null registry operations");
        Preconditions.checkArgument(user != null, "null user");
        Preconditions.checkArgument(JstormYarnUtils.isSet(jstormServiceClass), "unset service class");
        Preconditions.checkArgument(JstormYarnUtils.isSet(instanceName), "instanceName");
        Preconditions.checkArgument(applicationAttemptId != null, "null applicationAttemptId");
        this.registryOperations = registryOperations;
        this.user = user;
        this.jstormServiceClass = jstormServiceClass;
        this.instanceName = instanceName;
        this.applicationAttemptId = applicationAttemptId;
    }

    public ApplicationAttemptId getApplicationAttemptId() {
        return applicationAttemptId;
    }

    public String getUser() {
        return user;
    }

    public String getSliderServiceClass() {
        return jstormServiceClass;
    }

    public String getInstanceName() {
        return instanceName;
    }

    public RegistryOperations getRegistryOperations() {
        return registryOperations;
    }

    public ServiceRecord getSelfRegistration() {
        return selfRegistration;
    }

    private void setSelfRegistration(ServiceRecord selfRegistration) {
        this.selfRegistration = selfRegistration;
    }

    /**
     * Get the path to where the service has registered itself.
     * Null until the service is registered
     * @return the service registration path.
     */
    public String getSelfRegistrationPath() {
        return selfRegistrationPath;
    }

    /**
     * Get the absolute path to where the service has registered itself.
     * This includes the base registry path
     * Null until the service is registered
     * @return the service registration path.
     */
    public String getAbsoluteSelfRegistrationPath() {
        if (selfRegistrationPath == null) {
            return null;
        }
        String root = registryOperations.getConfig().getTrimmed(RegistryConstants.KEY_REGISTRY_ZK_ROOT,
                RegistryConstants.DEFAULT_ZK_REGISTRY_ROOT);
        return RegistryPathUtils.join(root, selfRegistrationPath);
    }

    /**
     * Add a component under the jstorm name/entry
     * @param componentName component name
     * @param record record to put
     * @throws IOException
     */
    public void putComponent(String componentName, ServiceRecord record) throws IOException {
        putComponent(jstormServiceClass, instanceName, componentName, record);
    }

    /**
     * Add a component 
     * @param serviceClass service class to use under ~user
     * @param componentName component name
     * @param record record to put
     * @throws IOException
     */
    public void putComponent(String serviceClass, String serviceName, String componentName, ServiceRecord record)
            throws IOException {
        String path = RegistryUtils.componentPath(user, serviceClass, serviceName, componentName);
        registryOperations.mknode(RegistryPathUtils.parentOf(path), true);
        registryOperations.bind(path, record, BindFlags.OVERWRITE);
    }

    /**
     * Add a service under a path, optionally purging any history
     * @param username user
     * @param serviceClass service class to use under ~user
     * @param serviceName name of the service
     * @param record service record
     * @param deleteTreeFirst perform recursive delete of the path first.
     * @return the path the service was created at
     * @throws IOException
     */
    public String putService(String username, String serviceClass, String serviceName, ServiceRecord record,
            boolean deleteTreeFirst) throws IOException {
        String path = RegistryUtils.servicePath(username, serviceClass, serviceName);
        if (deleteTreeFirst) {
            registryOperations.delete(path, true);
        }
        registryOperations.mknode(RegistryPathUtils.parentOf(path), true);
        registryOperations.bind(path, record, BindFlags.OVERWRITE);
        return path;
    }

    /**
     * Add a service under a path for the current user
     * @param serviceClass service class to use under ~user
     * @param serviceName name of the service
     * @param record service record
     * @param deleteTreeFirst perform recursive delete of the path first
     * @return the path the service was created at
     * @throws IOException
     */
    public String putService(String serviceClass, String serviceName, ServiceRecord record, boolean deleteTreeFirst)
            throws IOException {
        return putService(user, serviceClass, serviceName, record, deleteTreeFirst);
    }

    /**
     * Add a service under a path for the current user
     * @param record service record
     * @param deleteTreeFirst perform recursive delete of the path first
     * @return the path the service was created at
     * @throws IOException
     */
    public String registerSelf(ServiceRecord record, boolean deleteTreeFirst) throws IOException {
        selfRegistrationPath = putService(user, jstormServiceClass, instanceName, record, deleteTreeFirst);
        setSelfRegistration(record);
        return selfRegistrationPath;
    }

    /**
     * Update the self record by pushing out the latest version of the service
     * registration record. 
     * @throws IOException any failure.
     */
    public void updateSelf() throws IOException {
        putService(user, jstormServiceClass, instanceName, selfRegistration, false);
    }

    /**
     * Delete a component
     * @param componentName component name
     * @throws IOException
     */
    public void deleteComponent(String componentName) throws IOException {
        String path = RegistryUtils.componentPath(user, jstormServiceClass, instanceName, componentName);
        registryOperations.delete(path, false);
    }

    /**
     * Delete the children of a path -but not the path itself.
     * It is not an error if the path does not exist
     * @param path path to delete
     * @param recursive flag to request recursive deletes
     * @throws IOException IO problems
     */
    public void deleteChildren(String path, boolean recursive) throws IOException {
        List<String> childNames = null;
        try {
            childNames = registryOperations.list(path);
        } catch (PathNotFoundException e) {
            return;
        }
        for (String childName : childNames) {
            String child = join(path, childName);
            registryOperations.delete(child, recursive);
        }
    }

}