bool checkSavedFileCRC(IFile * ifile, bool & timesDiffer, unsigned & storedCrc) { StringBuffer s(ifile->queryFilename()); s.append(".crc"); Owned<IFile> crcFile = createIFile(s.str()); size32_t crcSz = (size32_t)crcFile->size(); Owned<IFileIO> crcIO = crcFile->open(IFOread); bool performCrc = false; timesDiffer = false; if (crcIO) { Owned<IFileIOStream> crcStream = createIOStream(crcIO); if (sizeof(storedCrc) == crcSz) // backward compat. if = in size to just crc (no date stamps) { verifyex(crcSz == crcStream->read(crcSz, &storedCrc)); performCrc = true; } else { size32_t sz; verifyex(sizeof(sz) == crcStream->read(sizeof(sz), &sz)); void *mem = malloc(sz); MemoryBuffer mb; mb.setBuffer(sz, mem, true); verifyex(sz == crcStream->read(sz, mem)); CDateTime storedCreateTime(mb); CDateTime storedModifiedTime(mb); CDateTime createTime, modifiedTime, accessedTime; ifile->getTime(&createTime, &modifiedTime, &accessedTime); if (!storedCreateTime.equals(createTime) || !storedModifiedTime.equals(modifiedTime)) timesDiffer = true; else { mb.read(storedCrc); performCrc = true; } } } return performCrc; }
void unlock(SessionId owner) { sect.enter(); if (exclusivenest) { exclusivenest--; if (exclusivenest) { // still locked assertex(owners.item(0)==owner); sect.leave(); return; } } verifyex(owners.zap(owner)); if (owners.ordinality()==0) { exclusivenest = 0; if (waiting) { sem.signal(waiting); waiting = 0; } } else { assertex(!exclusivenest); } sect.leave(); }
void prepareKey(IDistributedFile *index) { IDistributedFile *f = index; IDistributedSuperFile *super = f->querySuperFile(); unsigned nparts = f->numParts(); // includes tlks if any, but unused in array performPartLookup.ensure(nparts); bool checkTLKConsistency = (nullptr != super) && !localKey && (0 != (TIRsorted & indexBaseHelper->getFlags())); if (nofilter) { while (nparts--) performPartLookup.append(true); if (!checkTLKConsistency) return; } else { while (nparts--) performPartLookup.append(false); // parts to perform lookup set later } Owned<IDistributedFileIterator> iter; if (super) { iter.setown(super->getSubFileIterator(true)); verifyex(iter->first()); f = &iter->query(); } unsigned width = f->numParts(); if (!localKey) --width; assertex(width); unsigned tlkCrc = 0; bool first = true; unsigned superSubIndex=0; bool fileCrc = false, rowCrc = false; for (;;) { Owned<IDistributedFilePart> part = f->getPart(width); if (checkTLKConsistency) { unsigned _tlkCrc; if (part->getCrc(_tlkCrc)) fileCrc = true; else if (part->queryAttributes().hasProp("@crc")) // NB: key "@crc" is not a crc on the file, but data within. { _tlkCrc = part->queryAttributes().getPropInt("@crc"); rowCrc = true; } else if (part->queryAttributes().hasProp("@tlkCrc")) // backward compat. { _tlkCrc = part->queryAttributes().getPropInt("@tlkCrc"); rowCrc = true; } else { if (rowCrc || fileCrc) { checkTLKConsistency = false; Owned<IException> e = MakeActivityWarning(&container, 0, "Cannot validate that tlks in superfile %s match, some crc attributes are missing", super->queryLogicalName()); queryJobChannel().fireException(e); } } if (rowCrc && fileCrc) { checkTLKConsistency = false; Owned<IException> e = MakeActivityWarning(&container, 0, "Cannot validate that tlks in superfile %s match, due to mixed crc types.", super->queryLogicalName()); queryJobChannel().fireException(e); } if (checkTLKConsistency) { if (first) { tlkCrc = _tlkCrc; first = false; } else if (tlkCrc != _tlkCrc) throw MakeActivityException(this, 0, "Sorted output on super files comprising of non coparitioned sub keys is not supported (TLK's do not match)"); } } if (!nofilter) { Owned<IKeyIndex> keyIndex; unsigned copy; for (copy=0; copy<part->numCopies(); copy++) { RemoteFilename rfn; OwnedIFile ifile = createIFile(part->getFilename(rfn,copy)); if (ifile->exists()) { StringBuffer remotePath; rfn.getRemotePath(remotePath); unsigned crc = 0; part->getCrc(crc); keyIndex.setown(createKeyIndex(remotePath.str(), crc, false, false)); break; } } if (!keyIndex) throw MakeThorException(TE_FileNotFound, "Top level key part does not exist, for key: %s", index->queryLogicalName()); unsigned fixedSize = indexBaseHelper->queryDiskRecordSize()->querySerializedDiskMeta()->getFixedSize(); // used only if fixed Owned <IKeyManager> tlk = createLocalKeyManager(keyIndex, fixedSize, NULL); indexBaseHelper->createSegmentMonitors(tlk); tlk->finishSegmentMonitors(); tlk->reset(); while (tlk->lookup(false)) { if (tlk->queryFpos()) performPartLookup.replace(true, (aindex_t)(super?super->numSubFiles(true)*(tlk->queryFpos()-1)+superSubIndex:tlk->queryFpos()-1)); } } if (!super||!iter->next()) break; superSubIndex++; f = &iter->query(); if (width != f->numParts()-1) throw MakeActivityException(this, 0, "Super key %s, with mixture of sub key width are not supported.", f->queryLogicalName()); } }