Shireesh Anjal has posted comments on this change.

Change subject: engine: Refresh gluster data periodically
......................................................................


Patch Set 14: (4 inline comments)

Hi Moti,

Thanks for pointing our an interesting issue. I've explained my thinking and 
suggested an approach to tackle this in-line. Next patch-set will also include 
the new test case for the newly introduced SP.

~Shireesh

....................................................
File backend/manager/dbscripts/network_sp.sql
Line 310:    AS $procedure$
Line 311: BEGIN
Line 312:    RETURN QUERY SELECT *
Line 313:    FROM vds_interface_view
Line 314:    WHERE addr = v_addr;
I kept this SP generic to return all interfaces having a given ipaddress. 
Within the java code (GlusterVolumesListReturnForXmlRpc#getServer()), I have 
logic to pick up only the server that belongs to the appropriate cluster.

It might be possible to have multiple servers to have same ip address in case 
of a pure virt cluster. However it just won't work in case of a gluster 
cluster. Let us look at two scanarios:

1) The server was peer probed (gluster terminology for add host) using fully 
qualified domain name: In this case, the glusterVolumesList verb will also 
return the FQDN, and we can find it using getVdsDao().getAllForHostname(). 
There is no need to even try to fetch the hosts by ip address. So no problem 
here.

2) The server was peer probed using ip address. The peer probe will succeed 
only if the ip address is resolvable from the existing nodes of the cluster. If 
another host with same ip address already exists in the cluster, it cannot be 
added to a gluster cluster at all (peer probe command will fail). So there is 
no way we can end up with multiple servers with same ip address inside a 
gluster cluster.

There is one rare scenario, however, where we have a problem. Consider this:
- You have two servers who have same ip address on one of their interfaces
- User wants to add both these in a gluster+virt cluster, from webadmin UI
- First host added successfully to the cluster (using hostname)
- User tries to add the second host
- Host gets added to engine DB. In InitVdsOnUpCommand, a gluster peer probe of 
this server will be attempted, which will fail
- So this server goes to non-operational state
- Such servers are automatically removed by GlusterManager in case of 
gluster-only clusters, but *not* in case of virt+gluster clusters
- Effectively, we now have two servers in engine DB who have same ip address

I plan to change the code as follows to tackle this:

- Change the SP to fetch all network interfaces having given ip address *in the 
given cluster*
- If this SP returns more than one rows, throw an exception and do not update 
the bricks of the current volume being processed. This will make sure that we 
don't end up wrongly changing host id of an existing brick or inserting a new 
brick with the wrong host.

Let me know if you have any objections to any of this, or have a better 
suggestion.
Line 315: 
Line 316: END; $procedure$
Line 317: LANGUAGE plpgsql;
Line 318: 


....................................................
File 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterManager.java
Line 259: 
Line 260:     private List<String> getVdsIps(VDS vds) {
Line 261:         List<String> vdsIps = new ArrayList<String>();
Line 262:         for (VdsNetworkInterface iface : 
getInterfaceDao().getAllInterfacesForVds(vds.getId())) {
Line 263:             vdsIps.add(iface.getAddress());
It will not result in false positives, because server.getHostnameOrIp() will 
never be null. This comes from the hostname/ip address returned by the 'gluster 
volume info' command, which can never be empty or null. So while the list of ip 
addresses of the host interfaces might contain null, what we are looking for in 
this list will never be null, and hence it should be ok.

Having said this, I think it is still a good suggestion to filter out null 
values, and will do so in the next patch-set.
Line 264:         }
Line 265:         return vdsIps;
Line 266:     }
Line 267: 


....................................................
File 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/InterfaceDAODbFacadeImpl.java
Line 130:         MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
Line 131:                 .addValue("addr", ipAddress);
Line 132: 
Line 133:         return 
getCallsHandler().executeReadList("Getinterface_viewByAddr",
Line 134:                 vdsNetworkInterfaceRowMapper, parameterSource);
Done
Line 135:     }
Line 136: 
Line 137:     @SuppressWarnings("unchecked")
Line 138:     @Override


....................................................
File 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumesListReturnForXmlRpc.java
Line 170:         if(servers.size() > 0) {
Line 171:             return getServerOfCluster(clusterId, servers);
Line 172:         }
Line 173: 
Line 174:         List<VdsNetworkInterface> ifaces = 
getInterfaceDao().getAllInterfacesWithIpAddress(hostnameOrIp);
Have responded to the corresponding comment. Will change this piece of code 
based on the conclusion of that discussion.
Line 175:         if(ifaces.size() > 0) {
Line 176:             for(VdsNetworkInterface iface : ifaces) {
Line 177:                 VDS server = getVdsDao().get(iface.getVdsId());
Line 178:                 if(server.getvds_group_id().equals(clusterId)) {


--
To view, visit http://gerrit.ovirt.org/7288
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I6b61eb6e93105e46e2706eac1d94bc10717224c2
Gerrit-PatchSet: 14
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Shireesh Anjal <san...@redhat.com>
Gerrit-Reviewer: Daniel Erez <de...@redhat.com>
Gerrit-Reviewer: Moti Asayag <masa...@redhat.com>
Gerrit-Reviewer: Omer Frenkel <ofren...@redhat.com>
Gerrit-Reviewer: Shireesh Anjal <san...@redhat.com>
Gerrit-Reviewer: Yair Zaslavsky <yzasl...@redhat.com>
Gerrit-Reviewer: oVirt Jenkins CI Server
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to