GPPブロードキャストフォールトトレランステスト

1960 ワード

GPPでのブロードキャストはフォールトトレランスであり,すなわち,ブロードキャストの過程において,いくつかのプロセスを強制的に殺すと,ブロードキャストは依然として影響を受けない.フォールトトレランス機能を検証するには、次のテストプログラムを作成します.
    
/*
 * main.cpp
 *
 *  Created on: Apr 9, 2013
 *      Author: lichao
 */
#include "gpp.h"
#include <cstdlib>

class Packet : public GPP::Serializable
{
public:
	Packet()
	{
		_buf = NULL;
		_size = 0;
	}

	Packet(char * buf,int size)
	{
		_buf = (char *) malloc(size);
		memcpy(_buf,buf,size);
		_size = size;
	}
	virtual ~Packet()
	{
		if(!_buf)
		{
			free(_buf);
			_buf = NULL;
		}
	}
	void writeObject(GPP::DataStream& out)
	{
		out << _size;
		out.writeRawData(_buf,_size);
	}
	void readObject(GPP::DataStream& in)
	{
		in >> _size;
		_buf = (char *)malloc(_size);
		in.readRawData(_buf,_size);
	}
private:
	char * _buf;
	int _size;

};


class Handler : public GPP::BcastHandler<Packet>
{
public:
	Handler(){}
	virtual ~Handler()
	{

	}
	void handle(GPP::SharedPtr<Packet>& obj)
	{
		counter++;

		GPP::Log::Info("Received data for %5d.",counter);
		fflush(stdout);

	}
	static int getCounter()
	{
		return counter;
	}
private:
	static int counter;
};

int Handler::counter = 0;

int main(int argc,char *argv[])
{
	GPP::Init();
	GPP::Comm::RegisterHandler(99,new Handler());
	int size;
	char * buf;
	int rank = GPP::Comm::GetRank();
	if(rank == 0)
	{
		size = 1 << 25;
		buf = (char *)malloc(size);
		Packet * p = new Packet(buf,size);
		int loops = 100;
		while(loops--)
		{
			int rc = GPP::Comm::Bcast(p,99);
			if(rc < 0)
			{
				GPP::Log::Error(GPP::StrErr(rc));
				fflush(stdout);
			}
		}
		delete p;
	}
	GPP::MPI_Barrier(100);
	GPP::Log::Trace("Counter is %5d
",Handler::getCounter()); GPP::Finalize(); return 0; }

プログラムはカウンタを使用してブロードキャストのフォールトトレランス設計を検証します.すなわち、パケット損失は発生しません.
テストの結果、強制的にプロセスを殺すと、ブロードキャストが停止し、実行を続行できないことが分かった.これはGPPにおけるブロードキャストがフォールトトレランス設計においてまだバグがあることを示している.