public int GetChainAfterChunk(long chunk, List <ChunkListAndChainId> chainsChunksList) { Chain chain; if (!GetChain(chainId4Lookup, out chain)) { LogUtility.LogUtility.LogFile("Cannot get chain!!!! " + Convert.ToString(chainId4Lookup), ModuleLogLevel); CannotGetChain++; return(-1); } //LogUtility.LogUtility.LogFile("chain " + Convert.ToString(ch) + " chunks " + Convert.ToString(chain.chunkIds.Length), ModuleLogLevel); int chunk_idx; if (!FindChunkInChain(chain.chunkIds, chunk, out chunk_idx)) { // LogUtility.LogUtility.LogFile("Cannot find chunk!!!! " + Convert.ToString(chunkList[chunkListIdx]) + " in chain " + Convert.ToString(ch), ModuleLogLevel); CannotFindChunkInChain++; return(-2); } ChunkListAndChainId chunkListAndChainId = new ChunkListAndChainId(); chunkListAndChainId.chainId = chainId4Lookup; chunkListAndChainId.chunks = chain.chunkIds; chunkListAndChainId.firstChunkIdx = (uint)chunk_idx + 1; chainsChunksList.Add(chunkListAndChainId); return(0); }
public int ChainMatch(List <long> chunkList, int chunkListIdx, List <ChunkListAndChainId> chainsChunksList, List <long> sentChainsList) { Chain chain; uint longest_chain = 0; int foundChainLength; ChunkCB chunkCB; ChunkListAndChainId chunkListAndChainId; bool AtLeastEqualChainFound = false; #if false if (chunkMap.TryGetValue(chunkId, out chunkCB)) #else if (!GetChunkCB(chunkList[chunkListIdx], out chunkCB)) #endif { // LogUtility.LogUtility.LogFile("Cannot get chunk " + Convert.ToString(chunkList[chunkListIdx]), LogUtility.LogLevels.LEVEL_LOG_MEDIUM); return(-1); } // LogUtility.LogUtility.LogFile("****chunk to math found " + Convert.ToString(PackChunking.chunkToLen(chunkList[chunkListIdx])), ModuleLogLevel); foreach (long ch in chunkCB.chains) { if (sentChainsList.Contains(ch)) { AtLeastEqualChainFound = true; LogUtility.LogUtility.LogFile("Chain already sent " + Convert.ToString(ch), ModuleLogLevel); continue; } if (!GetChain(ch, out chain)) { LogUtility.LogUtility.LogFile("Cannot get chain!!!! " + Convert.ToString(ch), ModuleLogLevel); CannotGetChain++; continue; } //LogUtility.LogUtility.LogFile("chain " + Convert.ToString(ch) + " chunks " + Convert.ToString(chain.chunkIds.Length), ModuleLogLevel); int chunk_idx; if (!FindChunkInChain(chain.chunkIds, chunkList[chunkListIdx], out chunk_idx)) { // LogUtility.LogUtility.LogFile("Cannot find chunk!!!! " + Convert.ToString(chunkList[chunkListIdx]) + " in chain " + Convert.ToString(ch), ModuleLogLevel); CannotFindChunkInChain++; continue; } //LogUtility.LogUtility.LogFile("chunk id in chain " + Convert.ToString(chunk_idx), ModuleLogLevel); foundChainLength = CompareChains(chunkList, chunkListIdx + 1, chain.chunkIds, chunk_idx + 1); switch (foundChainLength) { case -1: /* different */ //Vadim 10/01/13 chainId4Lookup = 0; chainId4Lookup = 0; //Vadim 28/01/13 DifferentChains++; break; case 0: /* match but no longer */ //LogUtility.LogUtility.LogFile("equal chain found " + Convert.ToString(longest_chain) , ModuleLogLevel); FoundEqualChains++; AtLeastEqualChainFound = true; if (chainId4Lookup == 0) { // LogUtility.LogUtility.LogFile("equal chain found " + Convert.ToString(longest_chain), ModuleLogLevel); chainId4Lookup = ch; } break; default: { LongerChainsFound++; if (foundChainLength > longest_chain) { longest_chain = (uint)foundChainLength; chainId4Lookup = ch; } AtLeastEqualChainFound = true; // LogUtility.LogUtility.LogFile("****longer chain found " + Convert.ToString(longest_chain), ModuleLogLevel); bool chainFound = false; foreach (ChunkListAndChainId c in chainsChunksList) { if (c.chainId == ch) { //LogUtility.LogUtility.LogFile("****already in list", ModuleLogLevel); chainFound = true; } } if (!chainFound) { chunkListAndChainId = new ChunkListAndChainId(); chunkListAndChainId.chainId = ch; chunkListAndChainId.chunks = chain.chunkIds; chunkListAndChainId.firstChunkIdx = (uint)chunk_idx + (uint)(chunkList.Count - chunkListIdx); chainsChunksList.Add(chunkListAndChainId); // LogUtility.LogUtility.LogFile("****added to list, first chunk " + Convert.ToString(chunkListAndChainId.firstChunkIdx), ModuleLogLevel); } } break; } } if (!AtLeastEqualChainFound) { return(-1); } //chainId4Lookup = 0; return((int)longest_chain); }