/** * Update the list of members of this group. Members that disappear are lost, but members that * remain across the operation retain their state. * * @param urls */ public synchronized void setMembers(String[] urls) { HashMap<String, RangeMember> newMembers = new HashMap<String, RangeMember>(); for (int i = 0; i < urls.length; i++) { if (members.containsKey(urls[i])) { newMembers.put(urls[i], members.get(urls[i])); } else { RangeMember newMember = new RangeMember(); newMember.setUrlBase(urls[i]); newMembers.put(urls[i], newMember); } } members = newMembers; }
protected synchronized RangeMember findBestMember() { RangeMember best = null; int lowestWeight = RangeMember.UNUSABLE_WEIGHT; Iterator<RangeMember> itr = members.values().iterator(); while (itr.hasNext()) { RangeMember cur = itr.next(); int curWeight = cur.getWeight(); if (curWeight != RangeMember.UNUSABLE_WEIGHT) { if ((lowestWeight == RangeMember.UNUSABLE_WEIGHT) || (curWeight < lowestWeight)) { best = cur; lowestWeight = curWeight; } } } return best; }
/* (non-Javadoc) * @see org.archive.wayback.ResourceIndex#query(org.archive.wayback.core.WaybackRequest) */ public SearchResults query(WaybackRequest wbRequest) throws ResourceIndexNotAvailableException, ResourceNotInArchiveException, BadQueryException, AccessControlException { while (true) { RangeMember best = findBestMember(); if (best == null) { throw new ResourceIndexNotAvailableException("Unable to find active range for request."); } best.noteConnectionStart(); SearchResults results; try { results = best.query(wbRequest); best.noteConnectionSuccess(); return results; } catch (ResourceIndexNotAvailableException e) { best.noteConnectionFailure(); } catch (ResourceNotInArchiveException e1) { // need to catch and rethrow so we do accounting on // activeConnections. ResourceNotInArchive is still a // "connection success". best.noteConnectionSuccess(); throw e1; } } }
public void shutdown() throws IOException { for (RangeMember member : members.values()) { member.shutdown(); } }