/* * 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 org.apache.accumulo.server.conf; import org.apache.accumulo.core.Constants; import org.apache.accumulo.core.client.Instance; import org.apache.accumulo.core.zookeeper.ZooUtil; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; class NamespaceConfWatcher implements Watcher { static { Logger.getLogger("org.apache.zookeeper").setLevel(Level.WARN); Logger.getLogger("org.apache.hadoop.io.compress").setLevel(Level.WARN); } private static final Logger log = Logger.getLogger(NamespaceConfWatcher.class); private final Instance instance; private final String namespacesPrefix; private final int namespacesPrefixLength; private ServerConfigurationFactory scf; NamespaceConfWatcher(Instance instance) { this.instance = instance; namespacesPrefix = ZooUtil.getRoot(instance) + Constants.ZNAMESPACES + "/"; namespacesPrefixLength = namespacesPrefix.length(); scf = new ServerConfigurationFactory(instance); } static String toString(WatchedEvent event) { return new StringBuilder("{path=").append(event.getPath()).append(",state=").append(event.getState()).append(",type=").append(event.getType()).append("}") .toString(); } @Override public void process(WatchedEvent event) { String path = event.getPath(); if (log.isTraceEnabled()) log.trace("WatchedEvent : " + toString(event)); String namespaceId = null; String key = null; if (path != null) { if (path.startsWith(namespacesPrefix)) { namespaceId = path.substring(namespacesPrefixLength); if (namespaceId.contains("/")) { namespaceId = namespaceId.substring(0, namespaceId.indexOf('/')); if (path.startsWith(namespacesPrefix + namespaceId + Constants.ZNAMESPACE_CONF + "/")) key = path.substring((namespacesPrefix + namespaceId + Constants.ZNAMESPACE_CONF + "/").length()); } } if (namespaceId == null) { log.warn("Zookeeper told me about a path I was not watching: " + path + ", event " + toString(event)); return; } } switch (event.getType()) { case NodeDataChanged: if (log.isTraceEnabled()) log.trace("EventNodeDataChanged " + event.getPath()); if (key != null) scf.getNamespaceConfiguration(namespaceId).propertyChanged(key); break; case NodeChildrenChanged: scf.getNamespaceConfiguration(namespaceId).propertiesChanged(); break; case NodeDeleted: if (key == null) { ServerConfigurationFactory.removeCachedNamespaceConfiguration(instance.getInstanceID(), namespaceId); } break; case None: switch (event.getState()) { case Expired: ServerConfigurationFactory.expireAllTableObservers(); break; case SyncConnected: break; case Disconnected: break; default: log.warn("EventNone event not handled " + toString(event)); } break; case NodeCreated: switch (event.getState()) { case SyncConnected: break; default: log.warn("Event NodeCreated event not handled " + toString(event)); } break; default: log.warn("Event not handled " + toString(event)); } } }