From: Ryan K. <rk...@pa...> - 2007-08-08 20:13:03
|
Our problem is as follows (I apologize for those who have already heard = this): We have several sites, each with a router and switches behind the router = which are unaccessable from the web. The switches all have the same IP = scheme - 192.168.5.10, 192.168.5.15, etc. The problem is that when we = have two remote pollers on two different sites polling the same service, = the scheduler schedules all IPs that are the same, even if the node IDs = are different. A bug report has been filed on this issue, which is bug 1969. Below is what I believe could be a start to patch this problem for us, = but I am not sure how to proceed. ------------------------------------------------------------------------ This is the original code from=20 /usr/local/src/opennms-1.3.5-1/source/opennms-dao/src/main/java/org/openn= ms/netmgt/dao/hibernate/MonitoredServiceDaoHibernate.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 73 public Collection<OnmsMonitoredService> = findMatchingServices(ServiceSelector selector) { 74 Set<String> matchingIps =3D new = HashSet<String>(FilterDaoFactory.getInstance().getIPList(selector.getFilt= erRule())); 75 Set<String> matchingSvcs =3D new = HashSet<String>(selector.getServiceNames()); 76 77 List<OnmsMonitoredService> matchingServices =3D new = LinkedList<OnmsMonitoredService>(); 78 Collection<OnmsMonitoredService> services =3D findAll(); 79 for (OnmsMonitoredService svc : services) { 80 if ((matchingSvcs.contains(svc.getServiceName()) || = matchingSvcs.isEmpty()) && 81 matchingIps.contains(svc.getIpAddress())) { 82 83 matchingServices.add(svc); 84 } 85 86 } 87 88 89 return matchingServices; 90 } =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D I want to edit it to be the following: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 73 public Collection<OnmsMonitoredService> = findMatchingServices(ServiceSelector selector) { 74 Set<String> matchingIps =3D new = HashSet<String>(FilterDaoFactory.getInstance().getIPList(selector.getFilt= erRule())); 75 Set<String> matchingSvcs =3D new = HashSet<String>(selector.getServiceNames()); > Set<String> matchingNodeId =3D new = HashSet<String>(select.getNodeId()); 76 77 List<OnmsMonitoredService> matchingServices =3D new = LinkedList<OnmsMonitoredService>(); 78 Collection<OnmsMonitoredService> services =3D findAll(); 79 for (OnmsMonitoredService svc : services) { 80 if ((matchingSvcs.contains(svc.getServiceName()) || = matchingSvcs.isEmpty()) && > matchingNodeId.contains(svc.getNodeId()) && 81 matchingIps.contains(svc.getIpAddress())) { 82 83 matchingServices.add(svc); 84 } 85 86 } 87 88 89 return matchingServices; 90 } =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D This would require two things: * The OnmsMonitoredService class has getNodeId() which would return the = node id for which the service is attached to. This is already = implemented. * The ServiceSelector class has getNodeId() which would return the node = ID for the service (similar to above). This is not implemented. I would think that you could just throw in the function and the variable = to be stored, but then we would have to go into all the files that = instantiate ServiceSelector's, and make sure they assign the proper node = ID. This seems to only be effecting a few files, which include the = Package class, a class which seems to be compiled on the fly through an = xsd file. The other file that uses ServiceSelector is = DefaultCategoryStatusService.java, function createCategory, which = creates a new ServiceSelector in the function. I'm not sure if others = use it or not, but we would have to find all of them (or minimally the = ones that effect remote polling), and edit them to set and read data = properly from the ServiceSelector class. ------------------------------------------------------------------------ Any help would be greatly appreciated. I have taken another position on = solving this issue, by creating a test case that demonstrates the = failure. That information is posted in comment 2 of the bug listed = above. Thanks, Ryan K |