Status MetadataLoader::promotePendingChunks( const CollectionMetadata* afterMetadata, CollectionMetadata* remoteMetadata ) const { // Ensure pending chunks are applicable bool notApplicable = ( NULL == afterMetadata || NULL == remoteMetadata ) || ( afterMetadata->getShardVersion() > remoteMetadata->getShardVersion() ) || ( afterMetadata->getShardVersion().epoch() != remoteMetadata->getShardVersion().epoch() ); if ( notApplicable ) return Status::OK(); // The chunks from remoteMetadata are the latest version, and the pending chunks // from afterMetadata are the latest version. If no trickery is afoot, pending chunks // should match exactly zero or one loaded chunk. remoteMetadata->_pendingMap = afterMetadata->_pendingMap; // Resolve our pending chunks against the chunks we've loaded for ( RangeMap::iterator it = remoteMetadata->_pendingMap.begin(); it != remoteMetadata->_pendingMap.end(); ) { if ( !rangeMapOverlaps( remoteMetadata->_chunksMap, it->first, it->second ) ) { ++it; continue; } // Our pending range overlaps at least one chunk if ( rangeMapContains( remoteMetadata->_chunksMap, it->first, it->second ) ) { // Chunk was promoted from pending, successful migration LOG( 2 ) << "verified chunk " << rangeToString( it->first, it->second ) << " was migrated earlier to this shard" << endl; remoteMetadata->_pendingMap.erase( it++ ); } else { // Something strange happened, maybe manual editing of config? RangeVector overlap; getRangeMapOverlap( remoteMetadata->_chunksMap, it->first, it->second, &overlap ); string errMsg = str::stream() << "the remote metadata changed unexpectedly, pending range " << rangeToString( it->first, it->second ) << " does not exactly overlap loaded chunks " << overlapToString( overlap ); return Status( ErrorCodes::RemoteChangeDetected, errMsg ); } } return Status::OK(); }
inline void verifyEqualRanges (T startT, T endT, U startU, U endU, Verdict verdict = Verdict::WA){ T itT = startT; U itU = startU; while(true){ if(itT == endT && itU == endU) return; if(itT == endT || itU == endU) QUIT(verdict, "Length differ, " << expectation(rangeToString(startT, endT), rangeToString(startU, endU))); if(*itT != *itU) QUIT(verdict, expectation(rangeToString(startT, endT), rangeToString(startU, endU))); ++itT; ++itU; } }
inline void verifySorted(T start, T end, Verdict verdict = Verdict::WA, Compare comp = Compare()){ verify(std::is_sorted(start, end, comp), verdict, expectation("Sorted range", rangeToString(start, end))); }
static const VSFrameRef *VS_CC textGetFrame(int n, int activationReason, void **instanceData, void **frameData, VSFrameContext *frameCtx, VSCore *core, const VSAPI *vsapi) { TextData *d = static_cast<TextData *>(*instanceData); if (activationReason == arInitial) { vsapi->requestFrameFilter(n, d->node, frameCtx); } else if (activationReason == arAllFramesReady) { const VSFrameRef *src = vsapi->getFrameFilter(n, d->node, frameCtx); const VSFormat *frame_format = vsapi->getFrameFormat(src); if ((frame_format->sampleType == stInteger && frame_format->bitsPerSample > 16) || (frame_format->sampleType == stFloat && frame_format->bitsPerSample != 32)) { vsapi->freeFrame(src); vsapi->setFilterError((d->instanceName + ": Only 8..16 bit integer and 32 bit float formats supported").c_str(), frameCtx); return nullptr; } VSFrameRef *dst = vsapi->copyFrame(src, core); if (d->filter == FILTER_FRAMENUM) { scrawl_text(std::to_string(n), d->alignment, dst, vsapi); } else if (d->filter == FILTER_FRAMEPROPS) { const VSMap *props = vsapi->getFramePropsRO(dst); int numKeys = vsapi->propNumKeys(props); int i; std::string text = "Frame properties:\n"; if (!d->props.empty()) { for (const auto &iter : d->props) { append_prop(text, iter, props, vsapi); } } else { for (i = 0; i < numKeys; i++) { const char *key = vsapi->propGetKey(props, i); append_prop(text, key, props, vsapi); } } scrawl_text(text, d->alignment, dst, vsapi); } else if (d->filter == FILTER_COREINFO) { const VSCoreInfo *ci = vsapi->getCoreInfo(core); std::string text; text.append(ci->versionString).append("\n"); text.append("Threads: ").append(std::to_string(ci->numThreads)).append("\n"); text.append("Maximum framebuffer cache size: ").append(std::to_string(ci->maxFramebufferSize)).append(" bytes\n"); text.append("Used framebuffer cache size: ").append(std::to_string(ci->usedFramebufferSize)).append(" bytes"); scrawl_text(text, d->alignment, dst, vsapi); } else if (d->filter == FILTER_CLIPINFO) { const VSMap *props = vsapi->getFramePropsRO(src); std::string text = "Clip info:\n"; if (d->vi->width) { text += "Width: " + std::to_string(vsapi->getFrameWidth(dst, 0)) + " px\n"; text += "Height: " + std::to_string(vsapi->getFrameHeight(dst, 0)) + " px\n"; } else { text += "Width: " + std::to_string(vsapi->getFrameWidth(dst, 0)) + " px (may vary)\n"; text += "Height: " + std::to_string(vsapi->getFrameHeight(dst, 0)) + " px (may vary)\n"; } int snerr, sderr; int sn = int64ToIntS(vsapi->propGetInt(props, "_SARNum", 0, &snerr)); int sd = int64ToIntS(vsapi->propGetInt(props, "_SARDen", 0, &sderr)); if (snerr || sderr) text += "Aspect ratio: Unknown\n"; else text += "Sample aspect ratio: " + std::to_string(sn) + ":" + std::to_string(sd) + "\n"; text += "Length: " + std::to_string(d->vi->numFrames) + " frames\n"; text += "Format name: " + std::string(frame_format->name) + (d->vi->format ? "\n" : " (may vary)\n"); text += "Color family: " + colorFamilyToString(frame_format->colorFamily) + "\n"; text += "Sample type: " + std::string(frame_format->sampleType == stInteger ? "Integer" : "Float") + "\n"; text += "Bits per sample: " + std::to_string(frame_format->bitsPerSample) + "\n"; text += "Subsampling Height/Width: " + std::to_string(1 << frame_format->subSamplingH) + "x/" + std::to_string(1 << frame_format->subSamplingW) + "x\n"; int err; int matrix = int64ToIntS(vsapi->propGetInt(props, "_Matrix", 0, &err)); if (err) matrix = -1; int primaries = int64ToIntS(vsapi->propGetInt(props, "_Primaries", 0, &err)); if (err) primaries = -1; int transfer = int64ToIntS(vsapi->propGetInt(props, "_Transfer", 0, &err)); if (err) transfer = -1; int range = int64ToIntS(vsapi->propGetInt(props, "_ColorRange", 0, &err)); if (err) range = -1; int location = int64ToIntS(vsapi->propGetInt(props, "_ChromaLocation", 0, &err)); if (err) location = -1; int field = int64ToIntS(vsapi->propGetInt(props, "_FieldBased", 0, &err)); if (err) field = -1; const char *picttype = vsapi->propGetData(props, "_PictType", 0, &err); text += "Matrix: " + matrixToString(matrix) + "\n"; text += "Primaries: " + primariesToString(primaries) + "\n"; text += "Transfer: " + transferToString(transfer) + "\n"; text += "Range: " + rangeToString(range) + "\n"; text += "Chroma Location: " + chromaLocationToString(location) + "\n"; text += "Field handling: " + fieldBasedToString(field) + "\n"; text += "Picture type: " + std::string(picttype ? picttype : "Unknown") + "\n"; if (d->vi->fpsNum && d->vi->fpsDen) { text += "Fps: " + std::to_string(d->vi->fpsNum) + "/" + std::to_string(d->vi->fpsDen) + " (" + std::to_string(static_cast<double>(d->vi->fpsNum) / d->vi->fpsDen) + ")\n"; } else { text += "Fps: Unknown\n"; } int fnerr, fderr; int fn = int64ToIntS(vsapi->propGetInt(props, "_DurationNum", 0, &fnerr)); int fd = int64ToIntS(vsapi->propGetInt(props, "_DurationDen", 0, &fderr)); if (fnerr || fderr) { text += "Frame duration: Unknown\n"; } else { text += "Frame duration: " + std::to_string(fn) + "/" + std::to_string(fd) + " (" + std::to_string(static_cast<double>(fn) / fd) + ")\n"; } scrawl_text(text, d->alignment, dst, vsapi); } else { scrawl_text(d->text, d->alignment, dst, vsapi); } vsapi->freeFrame(src); return dst; } return nullptr; }