You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by dw...@apache.org on 2021/03/10 10:02:31 UTC

[lucene] branch jira/solr-14749-scheduler created (now 8c4b460)

This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a change to branch jira/solr-14749-scheduler
in repository https://gitbox.apache.org/repos/asf/lucene.git.


      at 8c4b460  SOLR-14749: Keep only scheduler-related bits here.

This branch includes the following new commits:

     new ba92dca  SOLR-14749: Move ClusterSingleton to a common package.
     new 8c4b460  SOLR-14749: Keep only scheduler-related bits here.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[lucene] 02/02: SOLR-14749: Keep only scheduler-related bits here.

Posted by dw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr-14749-scheduler
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit 8c4b460cda3df1d39366cacb8c838272ee4a1c56
Author: Andrzej Bialecki <ab...@apache.org>
AuthorDate: Fri Sep 4 11:07:47 2020 +0200

    SOLR-14749: Keep only scheduler-related bits here.
---
 .../apache/solr/cluster/events/ClusterEvent.java   |  39 -----
 .../solr/cluster/events/ClusterEventListener.java  |  41 -----
 .../solr/cluster/events/ClusterEventProducer.java  |  67 --------
 .../apache/solr/cluster/events/NodeDownEvent.java  |  30 ----
 .../apache/solr/cluster/events/NodeUpEvent.java    |  30 ----
 .../solr/cluster/events/ReplicaDownEvent.java      |  37 -----
 .../events/impl/AutoAddReplicasEventListener.java  | 102 ------------
 .../events/impl/ClusterEventProducerImpl.java      | 180 ---------------------
 .../apache/solr/cluster/scheduler/Schedulable.java |   7 +-
 9 files changed, 6 insertions(+), 527 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cluster/events/ClusterEvent.java b/solr/core/src/java/org/apache/solr/cluster/events/ClusterEvent.java
deleted file mode 100644
index ee8d955..0000000
--- a/solr/core/src/java/org/apache/solr/cluster/events/ClusterEvent.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.solr.cluster.events;
-
-import java.time.Instant;
-
-/**
- *
- */
-public interface ClusterEvent {
-
-  enum EventType {
-    NODE_DOWN,
-    NODE_UP,
-    REPLICA_DOWN,
-    // other types? eg. Overseer leader change, shard leader change,
-    // node overload (eg. CPU / MEM circuit breakers tripped)?
-  }
-
-  /** Get event type. */
-  EventType getType();
-
-  /** Get event timestamp. */
-  Instant getTimestamp();
-}
diff --git a/solr/core/src/java/org/apache/solr/cluster/events/ClusterEventListener.java b/solr/core/src/java/org/apache/solr/cluster/events/ClusterEventListener.java
deleted file mode 100644
index adf2e2b..0000000
--- a/solr/core/src/java/org/apache/solr/cluster/events/ClusterEventListener.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.solr.cluster.events;
-
-import java.util.Set;
-
-/**
- * Components that want to be notified of cluster-wide events should use this.
- *
- * XXX should this work only for ClusterSingleton-s? some types of events may be
- * XXX difficult (or pointless) to propagate to every node.
- */
-public interface ClusterEventListener {
-
-  /**
-   * The types of events that this listener can process.
-   */
-  Set<ClusterEvent.EventType> getEventTypes();
-
-  /**
-   * Handle the event. Implementations should be non-blocking - if any long
-   * processing is needed it should be performed asynchronously.
-   * @param event cluster event
-   */
-  void onEvent(ClusterEvent event);
-
-}
diff --git a/solr/core/src/java/org/apache/solr/cluster/events/ClusterEventProducer.java b/solr/core/src/java/org/apache/solr/cluster/events/ClusterEventProducer.java
deleted file mode 100644
index a46703d..0000000
--- a/solr/core/src/java/org/apache/solr/cluster/events/ClusterEventProducer.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.solr.cluster.events;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Component that produces {@link ClusterEvent} instances.
- */
-public interface ClusterEventProducer {
-
-  /**
-   * Returns a modifiable map of event types and listeners to process events
-   * of a given type.
-   */
-  Map<ClusterEvent.EventType, Set<ClusterEventListener>> getEventListeners();
-
-  /**
-   * Register an event listener. This listener will be notified about event
-   * of the types that it declares in {@link ClusterEventListener#getEventTypes()}
-   * @param listener non-null listener. If the same instance of the listener is
-   *                 already registered it will be ignored.
-   */
-  default void registerListener(ClusterEventListener listener) throws Exception {
-    listener.getEventTypes().forEach(type -> {
-      Set<ClusterEventListener> perType = getEventListeners().computeIfAbsent(type, t -> ConcurrentHashMap.newKeySet());
-      perType.add(listener);
-    });
-  }
-
-  /**
-   * Unregister an event listener.
-   * @param listener non-null listener.
-   */
-  default void unregisterListener(ClusterEventListener listener) {
-    listener.getEventTypes().forEach(type ->
-        getEventListeners().getOrDefault(type, Collections.emptySet()).remove(listener)
-    );
-  }
-
-  /**
-   * Fire an event. This method will call registered listeners that subscribed to the
-   * type of event being passed.
-   * @param event cluster event
-   */
-  default void fireEvent(ClusterEvent event) {
-    getEventListeners().getOrDefault(event.getType(), Collections.emptySet())
-        .forEach(listener -> listener.onEvent(event));
-  }
-}
diff --git a/solr/core/src/java/org/apache/solr/cluster/events/NodeDownEvent.java b/solr/core/src/java/org/apache/solr/cluster/events/NodeDownEvent.java
deleted file mode 100644
index 47e6d84..0000000
--- a/solr/core/src/java/org/apache/solr/cluster/events/NodeDownEvent.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.solr.cluster.events;
-
-/**
- *
- */
-public interface NodeDownEvent extends ClusterEvent {
-
-  @Override
-  default EventType getType() {
-    return EventType.NODE_DOWN;
-  }
-
-  String getNodeName();
-}
diff --git a/solr/core/src/java/org/apache/solr/cluster/events/NodeUpEvent.java b/solr/core/src/java/org/apache/solr/cluster/events/NodeUpEvent.java
deleted file mode 100644
index 594473d..0000000
--- a/solr/core/src/java/org/apache/solr/cluster/events/NodeUpEvent.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.solr.cluster.events;
-
-/**
- *
- */
-public interface NodeUpEvent extends ClusterEvent {
-
-  @Override
-  default EventType getType() {
-    return EventType.NODE_UP;
-  }
-
-  String getNodeName();
-}
diff --git a/solr/core/src/java/org/apache/solr/cluster/events/ReplicaDownEvent.java b/solr/core/src/java/org/apache/solr/cluster/events/ReplicaDownEvent.java
deleted file mode 100644
index bce20b4..0000000
--- a/solr/core/src/java/org/apache/solr/cluster/events/ReplicaDownEvent.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.solr.cluster.events;
-
-/**
- *
- */
-public interface ReplicaDownEvent extends ClusterEvent {
-
-  @Override
-  default EventType getType() {
-    return EventType.REPLICA_DOWN;
-  }
-
-  String getNodeName();
-
-  String getCollectionName();
-
-  String getShardName();
-
-  // so called coreNodeName
-  String getReplicaName();
-}
diff --git a/solr/core/src/java/org/apache/solr/cluster/events/impl/AutoAddReplicasEventListener.java b/solr/core/src/java/org/apache/solr/cluster/events/impl/AutoAddReplicasEventListener.java
deleted file mode 100644
index a10b846..0000000
--- a/solr/core/src/java/org/apache/solr/cluster/events/impl/AutoAddReplicasEventListener.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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.solr.cluster.events.impl;
-
-import java.lang.invoke.MethodHandles;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.solr.client.solrj.io.SolrClientCache;
-import org.apache.solr.cluster.events.ClusterEvent;
-import org.apache.solr.cluster.events.ClusterEventListener;
-import org.apache.solr.cloud.ClusterSingleton;
-import org.apache.solr.core.CoreContainer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- *
- */
-public class AutoAddReplicasEventListener implements ClusterSingleton, ClusterEventListener {
-  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-  private static final Set<ClusterEvent.EventType> EVENT_TYPES = new HashSet<>(
-      Arrays.asList(
-          ClusterEvent.EventType.NODE_DOWN,
-          ClusterEvent.EventType.REPLICA_DOWN
-      ));
-
-  private final CoreContainer cc;
-  private final SolrClientCache solrClientCache;
-
-  private boolean running = false;
-
-  public AutoAddReplicasEventListener(CoreContainer cc) {
-    this.cc = cc;
-    this.solrClientCache = cc.getSolrClientCache();
-  }
-
-  @Override
-  public Set<ClusterEvent.EventType> getEventTypes() {
-    return EVENT_TYPES;
-  }
-
-  @Override
-  public void onEvent(ClusterEvent event) {
-    if (!isRunning()) {
-      // ignore the event
-      return;
-    }
-    switch (event.getType()) {
-      case NODE_DOWN:
-        handleNodeDown(event);
-        break;
-      case NODE_UP:
-        // ignore?
-        break;
-      case REPLICA_DOWN:
-        handleReplicaDown(event);
-        break;
-      default:
-        log.warn("Unsupported event {}, ignoring...", event);
-    }
-  }
-
-  private void handleNodeDown(ClusterEvent event) {
-    // send MOVEREPLICA admin requests for all replicas from that node
-  }
-
-  private void handleReplicaDown(ClusterEvent event) {
-    // send ADDREPLICA admin request
-  }
-
-  @Override
-  public void start() throws Exception {
-    running = true;
-  }
-
-  @Override
-  public boolean isRunning() {
-    return running;
-  }
-
-  @Override
-  public void stop() {
-    running = false;
-  }
-}
diff --git a/solr/core/src/java/org/apache/solr/cluster/events/impl/ClusterEventProducerImpl.java b/solr/core/src/java/org/apache/solr/cluster/events/impl/ClusterEventProducerImpl.java
deleted file mode 100644
index 9fc218c..0000000
--- a/solr/core/src/java/org/apache/solr/cluster/events/impl/ClusterEventProducerImpl.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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.solr.cluster.events.impl;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.lang.invoke.MethodHandles;
-import java.time.Instant;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.solr.cloud.ZkController;
-import org.apache.solr.cluster.events.ClusterEvent;
-import org.apache.solr.cluster.events.ClusterEventListener;
-import org.apache.solr.cluster.events.ClusterEventProducer;
-import org.apache.solr.cloud.ClusterSingleton;
-import org.apache.solr.cluster.events.NodeDownEvent;
-import org.apache.solr.cluster.events.NodeUpEvent;
-import org.apache.solr.common.cloud.LiveNodesListener;
-import org.apache.solr.core.CoreContainer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Implementation of {@link ClusterEventProducer}.
- * <h3>Implementation notes</h3>
- * <p>For each cluster event relevant listeners are always invoked sequentially
- * (not in parallel) and in arbitrary order. This means that if any listener blocks the
- * processing other listeners may be invoked much later or not at all.</p>
- */
-public class ClusterEventProducerImpl implements ClusterEventProducer, ClusterSingleton, Closeable {
-  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-  private final Map<ClusterEvent.EventType, Set<ClusterEventListener>> listeners = new HashMap<>();
-  private final CoreContainer cc;
-  private LiveNodesListener liveNodesListener;
-  private ZkController zkController;
-  private boolean running;
-
-  private final Set<ClusterEvent.EventType> supportedEvents =
-      new HashSet<>() {{
-        add(ClusterEvent.EventType.NODE_DOWN);
-        add(ClusterEvent.EventType.NODE_UP);
-      }};
-
-  private volatile boolean isClosed = false;
-
-  public ClusterEventProducerImpl(CoreContainer coreContainer) {
-    this.cc = coreContainer;
-    this.zkController = this.cc.getZkController();
-  }
-
-  // ClusterSingleton lifecycle methods
-  @Override
-  public void start() {
-    if (zkController == null) {
-      liveNodesListener = null;
-      return;
-    }
-
-    // clean up any previous instances
-    doStop();
-
-    // register liveNodesListener
-    liveNodesListener = (oldNodes, newNodes) -> {
-      // already closed but still registered
-      if (isClosed) {
-        // remove the listener
-        return true;
-      }
-      // spurious event, ignore but keep listening
-      if (oldNodes.equals(newNodes)) {
-        return false;
-      }
-      oldNodes.forEach(oldNode -> {
-        if (!newNodes.contains(oldNode)) {
-          fireEvent(new NodeDownEvent() {
-            final Instant timestamp = Instant.now();
-            @Override
-            public Instant getTimestamp() {
-              return timestamp;
-            }
-
-            @Override
-            public String getNodeName() {
-              return oldNode;
-            }
-          });
-        }
-      });
-      newNodes.forEach(newNode -> {
-        if (!oldNodes.contains(newNode)) {
-          fireEvent(new NodeUpEvent() {
-            final Instant timestamp = Instant.now();
-            @Override
-            public Instant getTimestamp() {
-              return timestamp;
-            }
-            @Override
-            public String getNodeName() {
-              return newNode;
-            }
-          });
-        }
-      });
-      return false;
-    };
-
-    // XXX register collection state listener?
-    // XXX not sure how to efficiently monitor for REPLICA_DOWN events
-  }
-
-  @Override
-  public boolean isRunning() {
-    return running;
-  }
-
-  @Override
-  public void stop() {
-    doStop();
-    running = false;
-  }
-
-  private void doStop() {
-    if (liveNodesListener != null) {
-      zkController.zkStateReader.removeLiveNodesListener(liveNodesListener);
-    }
-    liveNodesListener = null;
-  }
-
-  private void ensureRunning() {
-    if (isClosed || !running) {
-      throw new RuntimeException("ClusterEventProducerImpl is not running.");
-    }
-  }
-
-  @Override
-  public void registerListener(ClusterEventListener listener) throws Exception {
-    ensureRunning();
-    try {
-      listener.getEventTypes().forEach(type -> {
-        if (!supportedEvents.contains(type)) {
-          throw new RuntimeException("event type " + type + " not supported yet");
-        }
-      });
-    } catch (Throwable e) {
-      throw new Exception(e);
-    }
-    ClusterEventProducer.super.registerListener(listener);
-  }
-
-  @Override
-  public void close() throws IOException {
-    stop();
-    isClosed = true;
-    listeners.clear();
-  }
-
-  @Override
-  public Map<ClusterEvent.EventType, Set<ClusterEventListener>> getEventListeners() {
-    ensureRunning();
-    return listeners;
-  }
-}
diff --git a/solr/core/src/java/org/apache/solr/cluster/scheduler/Schedulable.java b/solr/core/src/java/org/apache/solr/cluster/scheduler/Schedulable.java
index f907245..2f47fa4 100644
--- a/solr/core/src/java/org/apache/solr/cluster/scheduler/Schedulable.java
+++ b/solr/core/src/java/org/apache/solr/cluster/scheduler/Schedulable.java
@@ -17,11 +17,16 @@
 package org.apache.solr.cluster.scheduler;
 
 /**
- *
+ * Component to be scheduled and executed according to the schedule.
  */
 public interface Schedulable {
 
   Schedule getSchedule();
 
+  /**
+   * Execute the component.
+   * <p>NOTE: this should be a lightweight method that executes quickly, to avoid blocking the
+   * execution of other schedules. If it requires more work it should do this in a separate thread.</p>
+   */
   void run();
 }


[lucene] 01/02: SOLR-14749: Move ClusterSingleton to a common package.

Posted by dw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr-14749-scheduler
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit ba92dca3c206cd8031c8e0fcc5c53dfc0eb6678c
Author: Andrzej Bialecki <ab...@apache.org>
AuthorDate: Thu Sep 3 12:30:33 2020 +0200

    SOLR-14749: Move ClusterSingleton to a common package.
---
 .../org/apache/solr/{cluster/events => cloud}/ClusterSingleton.java     | 2 +-
 solr/core/src/java/org/apache/solr/cloud/Overseer.java                  | 1 -
 .../apache/solr/cluster/events/impl/AutoAddReplicasEventListener.java   | 2 +-
 .../org/apache/solr/cluster/events/impl/ClusterEventProducerImpl.java   | 2 +-
 .../java/org/apache/solr/cluster/scheduler/impl/SolrSchedulerImpl.java  | 2 +-
 5 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cluster/events/ClusterSingleton.java b/solr/core/src/java/org/apache/solr/cloud/ClusterSingleton.java
similarity index 98%
rename from solr/core/src/java/org/apache/solr/cluster/events/ClusterSingleton.java
rename to solr/core/src/java/org/apache/solr/cloud/ClusterSingleton.java
index f52cdb8..3aa7ec1 100644
--- a/solr/core/src/java/org/apache/solr/cluster/events/ClusterSingleton.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ClusterSingleton.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.solr.cluster.events;
+package org.apache.solr.cloud;
 
 /**
  * Intended for {@link org.apache.solr.core.CoreContainer} plugins that should be
diff --git a/solr/core/src/java/org/apache/solr/cloud/Overseer.java b/solr/core/src/java/org/apache/solr/cloud/Overseer.java
index 39085f4..f35e29f 100644
--- a/solr/core/src/java/org/apache/solr/cloud/Overseer.java
+++ b/solr/core/src/java/org/apache/solr/cloud/Overseer.java
@@ -47,7 +47,6 @@ import org.apache.solr.cloud.overseer.ReplicaMutator;
 import org.apache.solr.cloud.overseer.SliceMutator;
 import org.apache.solr.cloud.overseer.ZkStateWriter;
 import org.apache.solr.cloud.overseer.ZkWriteCommand;
-import org.apache.solr.cluster.events.ClusterSingleton;
 import org.apache.solr.common.AlreadyClosedException;
 import org.apache.solr.common.SolrCloseable;
 import org.apache.solr.common.SolrException;
diff --git a/solr/core/src/java/org/apache/solr/cluster/events/impl/AutoAddReplicasEventListener.java b/solr/core/src/java/org/apache/solr/cluster/events/impl/AutoAddReplicasEventListener.java
index ea15f28..a10b846 100644
--- a/solr/core/src/java/org/apache/solr/cluster/events/impl/AutoAddReplicasEventListener.java
+++ b/solr/core/src/java/org/apache/solr/cluster/events/impl/AutoAddReplicasEventListener.java
@@ -24,7 +24,7 @@ import java.util.Set;
 import org.apache.solr.client.solrj.io.SolrClientCache;
 import org.apache.solr.cluster.events.ClusterEvent;
 import org.apache.solr.cluster.events.ClusterEventListener;
-import org.apache.solr.cluster.events.ClusterSingleton;
+import org.apache.solr.cloud.ClusterSingleton;
 import org.apache.solr.core.CoreContainer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/solr/core/src/java/org/apache/solr/cluster/events/impl/ClusterEventProducerImpl.java b/solr/core/src/java/org/apache/solr/cluster/events/impl/ClusterEventProducerImpl.java
index 53389d4..9fc218c 100644
--- a/solr/core/src/java/org/apache/solr/cluster/events/impl/ClusterEventProducerImpl.java
+++ b/solr/core/src/java/org/apache/solr/cluster/events/impl/ClusterEventProducerImpl.java
@@ -29,7 +29,7 @@ import org.apache.solr.cloud.ZkController;
 import org.apache.solr.cluster.events.ClusterEvent;
 import org.apache.solr.cluster.events.ClusterEventListener;
 import org.apache.solr.cluster.events.ClusterEventProducer;
-import org.apache.solr.cluster.events.ClusterSingleton;
+import org.apache.solr.cloud.ClusterSingleton;
 import org.apache.solr.cluster.events.NodeDownEvent;
 import org.apache.solr.cluster.events.NodeUpEvent;
 import org.apache.solr.common.cloud.LiveNodesListener;
diff --git a/solr/core/src/java/org/apache/solr/cluster/scheduler/impl/SolrSchedulerImpl.java b/solr/core/src/java/org/apache/solr/cluster/scheduler/impl/SolrSchedulerImpl.java
index ee87da8..058d0fc 100644
--- a/solr/core/src/java/org/apache/solr/cluster/scheduler/impl/SolrSchedulerImpl.java
+++ b/solr/core/src/java/org/apache/solr/cluster/scheduler/impl/SolrSchedulerImpl.java
@@ -25,7 +25,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.solr.cluster.events.ClusterSingleton;
+import org.apache.solr.cloud.ClusterSingleton;
 import org.apache.solr.cluster.scheduler.Schedule;
 import org.apache.solr.cluster.scheduler.Schedulable;
 import org.apache.solr.cluster.scheduler.SolrScheduler;