- removed unused solr access classes - made snippet generation for documents aus YaCy RWI/DHT concurrent (as it was before the search process removation) - reduced the number of remote results in settings file because the processing of such mass documents add is too CPU-intensive (in Solr)pull/1/head
parent
7ff10bdb1b
commit
0f7ea7ad9f
@ -1,150 +0,0 @@
|
||||
/**
|
||||
* MultipleSolrConnector
|
||||
* Copyright 2011 by Michael Peter Christen
|
||||
* First released 08.11.2011 at http://yacy.net
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program in the file lgpl21.txt
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package net.yacy.cora.federate.solr.connector;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
|
||||
import net.yacy.cora.federate.solr.instance.SolrInstance;
|
||||
|
||||
import org.apache.solr.client.solrj.response.QueryResponse;
|
||||
import org.apache.solr.common.SolrException;
|
||||
import org.apache.solr.common.SolrInputDocument;
|
||||
import org.apache.solr.common.params.ModifiableSolrParams;
|
||||
|
||||
public class MultipleSolrConnector extends AbstractSolrConnector implements SolrConnector {
|
||||
|
||||
private final static SolrInputDocument POISON_DOC = new SolrInputDocument();
|
||||
|
||||
private final ArrayBlockingQueue<SolrInputDocument> queue;
|
||||
private final AddWorker[] worker;
|
||||
private final SolrConnector solr;
|
||||
|
||||
public MultipleSolrConnector(final SolrInstance instance, final String corename, final int connections) {
|
||||
this.solr = new RemoteSolrConnector(instance, corename);
|
||||
this.queue = new ArrayBlockingQueue<SolrInputDocument>(1000);
|
||||
this.worker = new AddWorker[connections];
|
||||
for (int i = 0; i < connections; i++) {
|
||||
this.worker[i] = new AddWorker(instance, corename);
|
||||
this.worker[i].start();
|
||||
}
|
||||
}
|
||||
|
||||
private class AddWorker extends Thread {
|
||||
private final SolrConnector solr;
|
||||
public AddWorker(final SolrInstance instance, final String corename) {
|
||||
this.solr = new RemoteSolrConnector(instance, corename);
|
||||
}
|
||||
@Override
|
||||
public void run() {
|
||||
SolrInputDocument doc;
|
||||
try {
|
||||
while ((doc = MultipleSolrConnector.this.queue.take()) != POISON_DOC) {
|
||||
try {
|
||||
this.solr.add(doc);
|
||||
} catch (SolrException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
} finally {
|
||||
this.solr.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void commit(boolean softCommit) {
|
||||
this.solr.commit(softCommit);
|
||||
}
|
||||
|
||||
/**
|
||||
* force an explicit merge of segments
|
||||
* @param maxSegments the maximum number of segments. Set to 1 for maximum optimization
|
||||
*/
|
||||
public void optimize(int maxSegments) {
|
||||
this.solr.optimize(maxSegments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
// send termination signal to worker
|
||||
for (@SuppressWarnings("unused") AddWorker element : this.worker) {
|
||||
try {
|
||||
this.queue.put(POISON_DOC);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
// wait for termination
|
||||
for (AddWorker element : this.worker) {
|
||||
try {
|
||||
element.join();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
this.solr.close();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() throws IOException {
|
||||
this.solr.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(final String id) throws IOException {
|
||||
this.solr.delete(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(final List<String> ids) throws IOException {
|
||||
this.solr.delete(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteByQuery(final String querystring) throws IOException {
|
||||
this.solr.deleteByQuery(querystring);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(final SolrInputDocument solrdoc) throws IOException, SolrException {
|
||||
try {
|
||||
this.queue.put(solrdoc);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryResponse query(final ModifiableSolrParams query) throws IOException, SolrException {
|
||||
return this.solr.query(query);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getSize() {
|
||||
return this.solr.getSize();
|
||||
}
|
||||
|
||||
}
|
@ -1,161 +0,0 @@
|
||||
/**
|
||||
* SolrRetryConnector
|
||||
* Copyright 2011 by Michael Peter Christen
|
||||
* First released 08.11.2011 at http://yacy.net
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program in the file lgpl21.txt
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package net.yacy.cora.federate.solr.connector;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.solr.client.solrj.response.QueryResponse;
|
||||
import org.apache.solr.common.SolrException;
|
||||
import org.apache.solr.common.SolrInputDocument;
|
||||
import org.apache.solr.common.params.ModifiableSolrParams;
|
||||
|
||||
public class RetrySolrConnector extends AbstractSolrConnector implements SolrConnector {
|
||||
|
||||
private final SolrConnector solrConnector;
|
||||
private final long retryMaxTime;
|
||||
|
||||
public RetrySolrConnector(final SolrConnector solrConnector, final long retryMaxTime) {
|
||||
this.solrConnector = solrConnector;
|
||||
this.retryMaxTime = retryMaxTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void commit(boolean softCommit) {
|
||||
this.solrConnector.commit(softCommit);
|
||||
}
|
||||
|
||||
/**
|
||||
* force an explicit merge of segments
|
||||
* @param maxSegments the maximum number of segments. Set to 1 for maximum optimization
|
||||
*/
|
||||
public void optimize(int maxSegments) {
|
||||
this.solrConnector.optimize(maxSegments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void close() {
|
||||
this.solrConnector.close();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() throws IOException {
|
||||
final long t = System.currentTimeMillis() + this.retryMaxTime;
|
||||
Throwable ee = null;
|
||||
while (System.currentTimeMillis() < t) try {
|
||||
this.solrConnector.clear();
|
||||
return;
|
||||
} catch (final Throwable e) {
|
||||
ee = e;
|
||||
try {Thread.sleep(10);} catch (final InterruptedException e1) {}
|
||||
continue;
|
||||
}
|
||||
if (ee != null) throw (ee instanceof IOException) ? (IOException) ee : new IOException(ee.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(final String id) throws IOException {
|
||||
final long t = System.currentTimeMillis() + this.retryMaxTime;
|
||||
Throwable ee = null;
|
||||
while (System.currentTimeMillis() < t) try {
|
||||
this.solrConnector.delete(id);
|
||||
return;
|
||||
} catch (final Throwable e) {
|
||||
ee = e;
|
||||
try {Thread.sleep(10);} catch (final InterruptedException e1) {}
|
||||
continue;
|
||||
}
|
||||
if (ee != null) throw (ee instanceof IOException) ? (IOException) ee : new IOException(ee.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(final List<String> ids) throws IOException {
|
||||
final long t = System.currentTimeMillis() + this.retryMaxTime;
|
||||
Throwable ee = null;
|
||||
while (System.currentTimeMillis() < t) try {
|
||||
this.solrConnector.delete(ids);
|
||||
return;
|
||||
} catch (final Throwable e) {
|
||||
ee = e;
|
||||
try {Thread.sleep(10);} catch (final InterruptedException e1) {}
|
||||
continue;
|
||||
}
|
||||
if (ee != null) throw (ee instanceof IOException) ? (IOException) ee : new IOException(ee.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteByQuery(final String querystring) throws IOException {
|
||||
final long t = System.currentTimeMillis() + this.retryMaxTime;
|
||||
Throwable ee = null;
|
||||
while (System.currentTimeMillis() < t) try {
|
||||
this.solrConnector.deleteByQuery(querystring);
|
||||
return;
|
||||
} catch (final Throwable e) {
|
||||
ee = e;
|
||||
try {Thread.sleep(10);} catch (final InterruptedException e1) {}
|
||||
continue;
|
||||
}
|
||||
if (ee != null) throw (ee instanceof IOException) ? (IOException) ee : new IOException(ee.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(final SolrInputDocument solrdoc) throws IOException, SolrException {
|
||||
final long t = System.currentTimeMillis() + this.retryMaxTime;
|
||||
Throwable ee = null;
|
||||
while (System.currentTimeMillis() < t) try {
|
||||
this.solrConnector.add(solrdoc);
|
||||
return;
|
||||
} catch (final Throwable e) {
|
||||
ee = e;
|
||||
try {Thread.sleep(10);} catch (final InterruptedException e1) {}
|
||||
continue;
|
||||
}
|
||||
if (ee != null) throw (ee instanceof IOException) ? (IOException) ee : new IOException(ee.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryResponse query(final ModifiableSolrParams query) throws IOException, SolrException {
|
||||
final long t = System.currentTimeMillis() + this.retryMaxTime;
|
||||
Throwable ee = null;
|
||||
while (System.currentTimeMillis() < t) try {
|
||||
return this.solrConnector.query(query);
|
||||
} catch (final Throwable e) {
|
||||
ee = e;
|
||||
try {Thread.sleep(10);} catch (final InterruptedException e1) {}
|
||||
continue;
|
||||
}
|
||||
if (ee != null) throw (ee instanceof IOException) ? (IOException) ee : new IOException(ee.getMessage());
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getSize() {
|
||||
final long t = System.currentTimeMillis() + this.retryMaxTime;
|
||||
while (System.currentTimeMillis() < t) try {
|
||||
return this.solrConnector.getSize();
|
||||
} catch (final Throwable e) {
|
||||
try {Thread.sleep(10);} catch (final InterruptedException e1) {}
|
||||
continue;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
@ -1,295 +0,0 @@
|
||||
/**
|
||||
* ShardSolrConnector
|
||||
* Copyright 2011 by Michael Peter Christen
|
||||
* First released 25.05.2011 at http://yacy.net
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program in the file lgpl21.txt
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package net.yacy.cora.federate.solr.connector;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import net.yacy.cora.sorting.ReversibleScoreMap;
|
||||
import net.yacy.cora.federate.solr.instance.ResponseAccumulator;
|
||||
import net.yacy.cora.federate.solr.instance.RemoteInstance;
|
||||
|
||||
import org.apache.solr.client.solrj.response.QueryResponse;
|
||||
import org.apache.solr.common.SolrDocument;
|
||||
import org.apache.solr.common.SolrDocumentList;
|
||||
import org.apache.solr.common.SolrException;
|
||||
import org.apache.solr.common.SolrInputDocument;
|
||||
import org.apache.solr.common.params.ModifiableSolrParams;
|
||||
|
||||
public class ShardSolrConnector extends AbstractSolrConnector implements SolrConnector {
|
||||
|
||||
private final ArrayList<RemoteInstance> instances;
|
||||
private final ArrayList<SolrConnector> connectors;
|
||||
private final ShardSelection sharding;
|
||||
private final ArrayList<String> adminInterfaces;
|
||||
|
||||
public ShardSolrConnector(
|
||||
ArrayList<RemoteInstance> instances,
|
||||
final ShardSelection.Method method, boolean multipleConnections) {
|
||||
this.instances = instances;
|
||||
this.connectors = new ArrayList<SolrConnector>();
|
||||
SolrConnector s;
|
||||
this.adminInterfaces = new ArrayList<String>(instances.size());
|
||||
String defaultCoreName = instances.get(0).getDefaultCoreName();
|
||||
for (final RemoteInstance instance: instances) {
|
||||
adminInterfaces.add(instance.getAdminInterface());
|
||||
s = multipleConnections ? new MultipleSolrConnector(instance, defaultCoreName, 2) : new RemoteSolrConnector(instance, defaultCoreName);
|
||||
this.connectors.add(s /*new RetrySolrConnector(s, timeout)*/);
|
||||
}
|
||||
this.sharding = new ShardSelection(method, this.connectors.size());
|
||||
}
|
||||
|
||||
public static ArrayList<RemoteInstance> getShardInstances(final String urlList, Collection<String> coreNames, String defaultCoreName) throws IOException {
|
||||
urlList.replace(' ', ',');
|
||||
String[] urls = urlList.split(",");
|
||||
ArrayList<RemoteInstance> instances = new ArrayList<RemoteInstance>();
|
||||
for (final String u: urls) {
|
||||
RemoteInstance instance = new RemoteInstance(u, coreNames, defaultCoreName);
|
||||
instances.add(instance);
|
||||
}
|
||||
return instances;
|
||||
}
|
||||
|
||||
public ArrayList<RemoteInstance> getInstances() {
|
||||
return this.instances;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void commit(boolean softCommit) {
|
||||
for (final SolrConnector connector: this.connectors) connector.commit(softCommit);
|
||||
}
|
||||
|
||||
/**
|
||||
* force an explicit merge of segments
|
||||
* @param maxSegments the maximum number of segments. Set to 1 for maximum optimization
|
||||
*/
|
||||
@Override
|
||||
public void optimize(int maxSegments) {
|
||||
for (final SolrConnector connector: this.connectors) connector.optimize(maxSegments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void close() {
|
||||
for (final SolrConnector connector: this.connectors) connector.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* delete everything in the solr index
|
||||
* @throws IOException
|
||||
*/
|
||||
@Override
|
||||
public void clear() throws IOException {
|
||||
for (final SolrConnector connector: this.connectors) connector.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* delete an entry from solr
|
||||
* @param id the url hash of the entry
|
||||
* @throws IOException
|
||||
*/
|
||||
@Override
|
||||
public void delete(final String id) throws IOException {
|
||||
for (final SolrConnector connector: this.connectors) connector.delete(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* delete a set of entries from solr; entries are identified by their url hash
|
||||
* @param ids a list of url hashes
|
||||
* @throws IOException
|
||||
*/
|
||||
@Override
|
||||
public void delete(final List<String> ids) throws IOException {
|
||||
for (final SolrConnector connector: this.connectors) connector.delete(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteByQuery(final String querystring) throws IOException {
|
||||
for (final SolrConnector connector: this.connectors) connector.deleteByQuery(querystring);
|
||||
}
|
||||
|
||||
/**
|
||||
* check if a given id exists in solr
|
||||
* @param id
|
||||
* @return true if any entry in solr exists
|
||||
* @throws IOException
|
||||
*/
|
||||
@Override
|
||||
public boolean exists(final String fieldName, final String key) throws IOException {
|
||||
for (final SolrConnector connector: this.connectors) {
|
||||
if (connector.exists(fieldName, key)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SolrDocument getById(final String key, final String ... fields) throws IOException {
|
||||
for (final SolrConnector connector: this.connectors) {
|
||||
SolrDocument doc = connector.getById(key, fields);
|
||||
if (doc != null) return doc;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* add a Solr document
|
||||
* @param solrdoc
|
||||
* @throws IOException
|
||||
*/
|
||||
@Override
|
||||
public void add(final SolrInputDocument solrdoc) throws IOException {
|
||||
this.connectors.get(this.sharding.select(solrdoc)).add(solrdoc);
|
||||
}
|
||||
|
||||
/**
|
||||
* add a collection of Solr documents
|
||||
* @param docs
|
||||
* @throws IOException
|
||||
*/
|
||||
protected void addSolr(final Collection<SolrInputDocument> docs) throws IOException {
|
||||
for (final SolrInputDocument doc: docs) add(doc);
|
||||
}
|
||||
|
||||
/**
|
||||
* get a query result from solr
|
||||
* to get all results set the query String to "*:*"
|
||||
* @param querystring
|
||||
* @throws IOException
|
||||
*/
|
||||
@Override
|
||||
public SolrDocumentList query(final String querystring, final int offset, final int count, final String ... fields) throws IOException {
|
||||
final SolrDocumentList list = new SolrDocumentList();
|
||||
List<Thread> t = new ArrayList<Thread>();
|
||||
for (final SolrConnector connector: this.connectors) {
|
||||
Thread t0 = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
final SolrDocumentList l = connector.query(querystring, offset, count, fields);
|
||||
for (final SolrDocument d: l) {
|
||||
list.add(d);
|
||||
}
|
||||
} catch (IOException e) {}
|
||||
}
|
||||
};
|
||||
t0.start();
|
||||
t.add(t0);
|
||||
}
|
||||
for (Thread t0: t) {
|
||||
try {t0.join();} catch (InterruptedException e) {}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public QueryResponse query(final ModifiableSolrParams query) throws IOException, SolrException {
|
||||
final Collection<QueryResponse> qrl = new ConcurrentLinkedQueue<QueryResponse>();
|
||||
// concurrently call all shards
|
||||
List<Thread> t = new ArrayList<Thread>();
|
||||
for (final SolrConnector connector: this.connectors) {
|
||||
Thread t0 = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
QueryResponse rsp;
|
||||
try {
|
||||
rsp = connector.query(query);
|
||||
} catch (Throwable e) {return;}
|
||||
qrl.add(rsp);
|
||||
}
|
||||
};
|
||||
t0.start();
|
||||
t.add(t0);
|
||||
}
|
||||
for (Thread t0: t) {
|
||||
try {t0.join();} catch (InterruptedException e) {}
|
||||
}
|
||||
|
||||
// prepare combined response
|
||||
return ResponseAccumulator.combineResponses(qrl);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getQueryCount(final String querystring) throws IOException {
|
||||
final AtomicLong count = new AtomicLong(0);
|
||||
List<Thread> t = new ArrayList<Thread>();
|
||||
for (final SolrConnector connector: this.connectors) {
|
||||
Thread t0 = new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
count.addAndGet(connector.getQueryCount(querystring));
|
||||
} catch (IOException e) {}
|
||||
}
|
||||
};
|
||||
t0.start();
|
||||
t.add(t0);
|
||||
}
|
||||
for (Thread t0: t) {
|
||||
try {t0.join();} catch (InterruptedException e) {}
|
||||
}
|
||||
return count.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, ReversibleScoreMap<String>> getFacets(String query, int maxresults, final String ... fields) throws IOException {
|
||||
Map<String, ReversibleScoreMap<String>> facets = new HashMap<String, ReversibleScoreMap<String>>();
|
||||
for (final SolrConnector connector: this.connectors) {
|
||||
Map<String, ReversibleScoreMap<String>> peer = connector.getFacets(query, maxresults, fields);
|
||||
innerloop: for (Map.Entry<String, ReversibleScoreMap<String>> facet: facets.entrySet()) {
|
||||
ReversibleScoreMap<String> peerfacet = peer.remove(facet.getKey());
|
||||
if (peerfacet == null) continue innerloop;
|
||||
for (String key: peerfacet) facet.getValue().inc(key, peerfacet.get(key));
|
||||
}
|
||||
for (Map.Entry<String, ReversibleScoreMap<String>> peerfacet: peer.entrySet()) {
|
||||
facets.put(peerfacet.getKey(), peerfacet.getValue());
|
||||
}
|
||||
}
|
||||
return facets;
|
||||
}
|
||||
|
||||
|
||||
public long[] getSizeList() {
|
||||
final long[] size = new long[this.connectors.size()];
|
||||
int i = 0;
|
||||
for (final SolrConnector connector: this.connectors) {
|
||||
size[i++] = connector.getSize();
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getSize() {
|
||||
final long[] size = getSizeList();
|
||||
long s = 0;
|
||||
for (final long l: size) s += l;
|
||||
return s;
|
||||
}
|
||||
|
||||
public ArrayList<String> getAdminInterfaces() {
|
||||
return this.adminInterfaces;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in new issue