void serializeSlaveData(MemoryBuffer &dst, unsigned slave) { if (!container.queryLocal()) { serializeMPtag(dst, mpTag); if (!isAll()) { serializeMPtag(dst, broadcast2MpTag); serializeMPtag(dst, broadcast3MpTag); serializeMPtag(dst, lhsDistributeTag); serializeMPtag(dst, rhsDistributeTag); } } }
virtual void serializeSlaveData(MemoryBuffer &dst, unsigned slave) { serializeMPtag(dst, mpTag); }
void serializeSlaveData(MemoryBuffer &dst, unsigned slave) { serializeMPtag(dst, mpTag); dst.append(sD[slave].length()); dst.append(sD[slave].length(), sD[slave].toByteArray()); }
virtual void process() { ActPrintLog("GlobalMergeActivityMaster::process"); CMasterActivity::process(); IHThorMergeArg *helper = (IHThorMergeArg *)queryHelper(); Owned<IThorRowInterfaces> rowif = createRowInterfaces(helper->queryOutputMeta()); CThorKeyArray sample(*this, rowif,helper->querySerialize(),helper->queryCompare(),helper->queryCompareKey(),helper->queryCompareRowKey()); unsigned n = container.queryJob().querySlaves(); mptag_t *replytags = new mptag_t[n]; mptag_t *intertags = new mptag_t[n]; unsigned i; for (i=0;i<n;i++) { replytags[i] = TAG_NULL; intertags[i] = TAG_NULL; } try { for (i=0;i<n;i++) { if (abortSoon) return; CMessageBuffer mb; #ifdef _TRACE ActPrintLog("Merge process, Receiving on tag %d",replyTag); #endif rank_t sender; if (!receiveMsg(mb, RANK_ALL, replyTag, &sender)||abortSoon) return; #ifdef _TRACE ActPrintLog("Merge process, Received sample from %d",sender); #endif sender--; assertex((unsigned)sender<n); assertex(replytags[(unsigned)sender]==TAG_NULL); deserializeMPtag(mb,replytags[(unsigned)sender]); deserializeMPtag(mb,intertags[(unsigned)sender]); sample.deserialize(mb,true); } ActPrintLog("GlobalMergeActivityMaster::process samples merged"); sample.createSortedPartition(n); ActPrintLog("GlobalMergeActivityMaster::process partition generated"); for (i=0;i<n;i++) { if (abortSoon) break; CMessageBuffer mb; mb.append(n); for (unsigned j = 0;j<n;j++) serializeMPtag(mb,intertags[j]); sample.serialize(mb); #ifdef _TRACE ActPrintLog("Merge process, Replying to node %d tag %d",i+1,replytags[i]); #endif if (!queryJobChannel().queryJobComm().send(mb, (rank_t)i+1, replytags[i])) break; } } catch (IException *e) { delete [] replytags; delete [] intertags; ActPrintLog(e, "MERGE"); throw; } delete [] replytags; delete [] intertags; ActPrintLog("GlobalMergeActivityMaster::process exit"); }