Home Help Center

Patch of IceGrid replica-group type None

sinofoolsinofool Member Bochun BaiOrganization: sinofool.comProject: http://sinofool.com/ ✭✭
Hi guys
I have patched IceGrid for my requirements of cluster. I hope there is another way without patching IceGrid.

I am using IceGrid for web server caches. The key problem of my application is not CPU circle but the memory usage limit of x86-32. So the Ice-oriented replica is not suitable for me.
The way I balance the load is caching different data in different service, using dataId % replica_num determining which service to use.
It works fine for more than 4G data in memory on 3 machines. But there is a problem of reliability.
Any node of the grid fail will cause my entire application down.
Changing client implies is a way to solve my problem while I prefer the client remain.

The IceGrid provides four types of replica group: None, random, round-robin and adaptive. If there is a replica-group type: return only the first proxy of service, and auto transfer failures when the first node down. It will benefit to my requirements. Then my application will be:
Attachment not found.
My replica group must be type=None and n-replicas=1, unfortunately, “None” type has no parameter of n-replicas.

Here is the code I changed:

vector<pair<string, AdapterPrx> >
ReplicaGroupEntry::getProxies(int& nReplicas, bool& replicaGroup)
    ReplicaSeq replicas;
    bool adaptive = false;
    LoadSample loadSample = LoadSample1;
	Lock sync(*this);
	replicaGroup = true;
	    return vector<pair<string, AdapterPrx> >();

	nReplicas = _loadBalancingNReplicas > 0 ? _loadBalancingNReplicas : static_cast<int>(_replicas.size());
	    replicas = _replicas;
	    [COLOR="Red"]nReplicas = 1; // add this[/COLOR]
	    for(unsigned int i = 0; i < _replicas.size(); ++i)
		replicas.push_back(_replicas[(_lastReplica + i) % _replicas.size()]);
	    _lastReplica = (_lastReplica + 1) % static_cast<int>(_replicas.size());
	else if(AdaptiveLoadBalancingPolicyPtr::dynamicCast(_loadBalancing))
	    replicas = _replicas;
	    RandomNumberGenerator rng;
	    random_shuffle(replicas.begin(), replicas.end(), rng);
	    adaptive = true;
	    loadSample = _loadSample;
[COLOR="Lime"]	// this is the orignal
	else// if(RandomLoadBalancingPolicyPtr::dynamicCast(_loadBalancing))[/COLOR]
	[COLOR="Red"]else if(RandomLoadBalancingPolicyPtr::dynamicCast(_loadBalancing))[/COLOR]	{
	    replicas = _replicas;
	    RandomNumberGenerator rng;
	    random_shuffle(replicas.begin(), replicas.end(), rng);
In original IceGrid, None-replica-group means Random-replica-group with n-replica parameter equal to total replica count.
By changing these two lines, None-replica-group returns only the first proxy in the group. It will return the second proxy when the first is not available.

How can I do the same things without patching IceGrid itself?


  • benoitbenoit Rennes, FranceAdministrators, ZeroC Staff Benoit FoucherOrganization: ZeroC, Inc.Project: Ice ZeroC Staff

    Thanks for the suggestion! I'm afraid there's currently no way to do what you want without changing IceGrid though. We'll discuss changing this for the next release.

  • sinofoolsinofool Member Bochun BaiOrganization: sinofool.comProject: http://sinofool.com/ ✭✭

    because replica_num is fixed, id%replica_num is not reliable, so I have to cluster each node.
    If IceGrid has a replica-group type, which is not state-less, my changing is not necessory any more.
    If I can change the policy of choosing proxies on client side. It also solves the problem.
    I am still working on this problem.

    Ice will be the middle-layer for my new application.
    Till now, most of the Ice's problem is solved or pendding to solve in the next version.
    I want to thank you all give us what a wonderful tools.
    Hope the next release comming soon.(IceGrid registry cluster included).
Sign In or Register to comment.