Example usage for org.apache.solr.common.cloud ZkStateReader getAliases

List of usage examples for org.apache.solr.common.cloud ZkStateReader getAliases

Introduction

In this page you can find the example usage for org.apache.solr.common.cloud ZkStateReader getAliases.

Prototype

public Aliases getAliases() 

Source Link

Document

Get an immutable copy of the present state of the aliases.

Usage

From source file:com.doculibre.constellio.solr.context.SolrCoreContext.java

License:Open Source License

public static synchronized void initCores() {
    try {/*from  w ww  .j a v a 2 s .co m*/

        // do not use CoreAdminRequest
        Set<String> collectionNameSet = new HashSet<String>();
        mainSolrServer.connect();
        ZkStateReader reader = mainSolrServer.getZkStateReader();
        ClusterState state = reader.getClusterState();

        // do synchronization between coreServers and solrCloud
        for (String collectionName : state.getCollections()) {
            if (!collectionName.startsWith("_") || DEFAULT_COLLECTION_NAME.equals(collectionName)) {
                // "_xxx" is for system only, not for users
                collectionNameSet.add(collectionName);
            }
        }

        Map<String, String> aliasMap = reader.getAliases().getCollectionAliasMap();
        if (aliasMap != null) {
            for (String aliasName : aliasMap.keySet()) {
                if (!aliasName.startsWith("_")) {
                    // "_xxx" is for system only, not for users
                    collectionNameSet.remove(aliasMap.get(aliasName));
                    collectionNameSet.add(aliasName);
                }
            }
        }

        for (String collectionName : collectionNameSet) {
            if (!coreServers.containsKey(collectionName)) {
                setHttpSolrServer(collectionName, ConstellioSpringUtils.getSolrServerAddress());
            }
        }

        userCoreNames.clear();
        Iterator<Map.Entry<String, SolrServer>> iter = coreServers.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry<String, SolrServer> entry = iter.next();
            if (!collectionNameSet.contains(entry.getKey())) {
                entry.getValue().shutdown();
                iter.remove();
            } else if (!DEFAULT_COLLECTION_NAME.equals(entry.getKey())) {
                userCoreNames.add(entry.getKey());
            }
        }

        // CoreAdminRequest adminRequest = new CoreAdminRequest();
        // adminRequest.setAction(CoreAdminAction.STATUS);
        // CoreAdminResponse adminResponse =
        // adminRequest.process(solrServer);
        // NamedList<NamedList<Object>> coreStatus =
        // adminResponse.getCoreStatus();
        // for (Object core : coreStatus) {
        // String coreName = StringUtils.substringBefore(core.toString(),
        // "=");
        // if (!coreName.startsWith("_"))// "_xxx" is for system only, like
        // "_log", "_fetch_db"
        // setHttpSolrServer(coreName, ((HttpSolrServer)
        // solrServer).getBaseURL());
        // }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

From source file:de.qaware.chronix.storage.solr.ChronixSolrCloudStorage.java

License:Apache License

/**
 * Returns the list of shards of the default collection.
 *
 * @param zkHost            ZooKeeper URL
 * @param chronixCollection Solr collection name for chronix time series data
 * @return the list of shards of the default collection
 *///from  w w  w  . j  a  va 2  s .  c  o  m
public List<String> getShardList(String zkHost, String chronixCollection) throws IOException {

    CloudSolrClient cloudSolrClient = new CloudSolrClient(zkHost);
    List<String> shards = new ArrayList<>();

    try {
        cloudSolrClient.connect();

        ZkStateReader zkStateReader = cloudSolrClient.getZkStateReader();

        ClusterState clusterState = zkStateReader.getClusterState();

        String[] collections;
        if (clusterState.hasCollection(chronixCollection)) {
            collections = new String[] { chronixCollection };
        } else {
            // might be a collection alias?
            Aliases aliases = zkStateReader.getAliases();
            String aliasedCollections = aliases.getCollectionAlias(chronixCollection);
            if (aliasedCollections == null)
                throw new IllegalArgumentException("Collection " + chronixCollection + " not found!");
            collections = aliasedCollections.split(",");
        }

        Set<String> liveNodes = clusterState.getLiveNodes();
        Random random = new Random(5150);

        for (String coll : collections) {
            for (Slice slice : clusterState.getSlices(coll)) {
                List<String> replicas = new ArrayList<>();
                for (Replica r : slice.getReplicas()) {
                    if (r.getState().equals(Replica.State.ACTIVE)) {
                        ZkCoreNodeProps replicaCoreProps = new ZkCoreNodeProps(r);
                        if (liveNodes.contains(replicaCoreProps.getNodeName()))
                            replicas.add(replicaCoreProps.getCoreUrl());
                    }
                }
                int numReplicas = replicas.size();
                if (numReplicas == 0)
                    throw new IllegalStateException("Shard " + slice.getName() + " in collection " + coll
                            + " does not have any active replicas!");

                String replicaUrl = (numReplicas == 1) ? replicas.get(0)
                        : replicas.get(random.nextInt(replicas.size()));
                shards.add(replicaUrl);
            }
        }
    } finally {
        cloudSolrClient.close();
    }

    return shards;
}

From source file:org.vootoo.server.RequestProcesser.java

License:Apache License

public void handleRequest(RequestGetter requestGetter) {
    MDCLoggingContext.reset();/*  w w w. j a va 2  s  .  c  o m*/
    MDCLoggingContext.setNode(cores);

    String path = requestGetter.getPath();
    solrParams = requestGetter.getSolrParams();
    SolrRequestHandler handler = null;
    String corename = "";
    String origCorename = null;
    try {
        // set a request timer which can be reused by requests if needed
        //req.setAttribute(SolrRequestParsers.REQUEST_TIMER_SERVLET_ATTRIBUTE, new RTimer());
        // put the core container in request attribute
        //req.setAttribute("org.apache.solr.CoreContainer", cores);
        // check for management path
        String alternate = cores.getManagementPath();
        if (alternate != null && path.startsWith(alternate)) {
            path = path.substring(0, alternate.length());
        }
        // unused feature ?
        int idx = path.indexOf(':');
        if (idx > 0) {
            // save the portion after the ':' for a 'handler' path parameter
            path = path.substring(0, idx);
        }

        boolean usingAliases = false;
        List<String> collectionsList = null;

        // Check for container handlers
        handler = cores.getRequestHandler(path);
        if (handler != null) {
            solrReq = parseSolrQueryRequest(SolrRequestParsers.DEFAULT, requestGetter);
            handleAdminRequest(handler, solrReq);
            return;
        } else {
            //otherwise, we should find a core from the path
            idx = path.indexOf("/", 1);
            if (idx > 1) {
                // try to get the corename as a request parameter first
                corename = path.substring(1, idx);

                // look at aliases
                if (cores.isZooKeeperAware()) {
                    origCorename = corename;
                    ZkStateReader reader = cores.getZkController().getZkStateReader();
                    aliases = reader.getAliases();
                    if (aliases != null && aliases.collectionAliasSize() > 0) {
                        usingAliases = true;
                        String alias = aliases.getCollectionAlias(corename);
                        if (alias != null) {
                            collectionsList = StrUtils.splitSmart(alias, ",", true);
                            corename = collectionsList.get(0);
                        }
                    }
                }

                core = cores.getCore(corename);

                if (core != null) {
                    path = path.substring(idx);
                }
            }

            //add collection name
            if (core == null && StringUtils.isNotBlank(requestGetter.getCollection())) {
                corename = requestGetter.getCollection();
                core = cores.getCore(corename);
            }

            if (core == null) {
                if (!cores.isZooKeeperAware()) {
                    core = cores.getCore("");
                }
            }
        }

        if (core == null && cores.isZooKeeperAware()) {
            // we couldn't find the core - lets make sure a collection was not specified instead
            core = getCoreByCollection(cores, corename);

            if (core != null) {
                // we found a core, update the path
                path = path.substring(idx);
            }

            // try the default core
            if (core == null) {
                core = cores.getCore("");
                if (core != null) {
                }
            }
        }

        // With a valid core...
        if (core != null) {
            MDCLoggingContext.setCore(core);
            final SolrConfig config = core.getSolrConfig();
            // get or create/cache the parser for the core
            SolrRequestParsers parser = config.getRequestParsers();

            // Determine the handler from the url path if not set
            // (we might already have selected the cores handler)
            if (handler == null && path.length() > 1) { // don't match "" or "/" as valid path
                handler = core.getRequestHandler(path);

                if (handler == null) {
                    //may be a restlet path
                    // Handle /schema/* paths via Restlet
                    if (path.equals("/schema") || path.startsWith("/schema/")) {
                        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                                "unsupport /schema/**, use http solr");
                    }

                }
                // no handler yet but allowed to handle select; let's check
                if (handler == null && parser.isHandleSelect()) {
                    if ("/select".equals(path) || "/select/".equals(path)) {
                        solrReq = parseSolrQueryRequest(parser, requestGetter);

                        invalidStates = checkStateIsValid(cores,
                                solrReq.getParams().get(CloudSolrClient.STATE_VERSION));
                        String qt = solrReq.getParams().get(CommonParams.QT);
                        handler = core.getRequestHandler(qt);
                        if (handler == null) {
                            throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                                    "unknown handler: " + qt);
                        }
                        if (qt != null && qt.startsWith("/") && (handler instanceof ContentStreamHandlerBase)) {
                            //For security reasons it's a bad idea to allow a leading '/', ex: /select?qt=/update see SOLR-3161
                            //There was no restriction from Solr 1.4 thru 3.5 and it's not supported for update handlers.
                            throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                                    "Invalid Request Handler ('qt').  Do not use /select to access: " + qt);
                        }
                    }
                }
            }

            // With a valid handler and a valid core...
            if (handler != null) {
                // if not a /select, create the request
                if (solrReq == null) {
                    solrReq = parseSolrQueryRequest(parser, requestGetter);
                }

                if (usingAliases) {
                    processAliases(solrReq, aliases, collectionsList);
                }

                SolrQueryResponse solrRsp = new SolrQueryResponse();
                SolrRequestInfo.setRequestInfo(new SolrRequestInfo(solrReq, solrRsp));
                this.execute(handler, solrReq, solrRsp);
                QueryResponseWriter responseWriter = core.getQueryResponseWriter(solrReq);
                if (invalidStates != null)
                    solrReq.getContext().put(CloudSolrClient.STATE_VERSION, invalidStates);
                writeResponse(solrRsp, responseWriter, solrReq);

                return; // we are done with a valid handler
            }
        }
        logger.debug("no handler or core retrieved for {}, follow through...", path);
        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                "no handler or core retrieved for " + path);
    } catch (Throwable ex) {
        sendError(core, solrReq, ex);
        // walk the the entire cause chain to search for an Error
        Throwable t = ex;
        while (t != null) {
            if (t instanceof Error) {
                if (t != ex) {
                    logger.error(
                            "An Error was wrapped in another exception - please report complete stacktrace on SOLR-6161",
                            ex);
                }
                throw (Error) t;
            }
            t = t.getCause();
        }
        return;
    } finally {
        try {
            if (solrReq != null) {
                logger.debug("Closing out SolrRequest: {}", solrReq);
                solrReq.close();
            }
        } finally {
            try {
                if (core != null) {
                    core.close();
                }
            } finally {
                SolrRequestInfo.clearRequestInfo();
            }

        }
        MDCLoggingContext.clear();
    }
}