MCPcopy Create free account
hub / github.com/davidgiven/fluxengine / writeTracksAndVerify

Function writeTracksAndVerify

lib/algorithms/readerwriter.cc:532–598  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

530}
531
532void writeTracksAndVerify(const DiskLayout& diskLayout,
533 FluxSinkFactory& fluxSinkFactory,
534 Encoder& encoder,
535 FluxSource& fluxSource,
536 Decoder& decoder,
537 const Image& image,
538 const std::vector<CylinderHead>& chs)
539{
540 writeTracks(
541 diskLayout,
542 fluxSinkFactory,
543 [&](const std::shared_ptr<const LogicalTrackLayout>& ltl)
544 {
545 auto sectors = encoder.collectSectors(*ltl, image);
546 return encoder.encode(*ltl, sectors, image);
547 },
548 [&](const std::shared_ptr<const LogicalTrackLayout>& ltl)
549 {
550 FluxSourceIteratorHolder fluxSourceIteratorHolder(fluxSource);
551 std::vector<std::shared_ptr<const Track>> tracks;
552 auto [result, sectors] = readGroup(
553 diskLayout, fluxSourceIteratorHolder, ltl, tracks, decoder);
554 log(TrackReadLogMessage{tracks, sectors});
555
556 if (result != GOOD_READ)
557 {
558 adjustTrackOnError(fluxSource, ltl->physicalCylinder);
559 log("bad read");
560 return false;
561 }
562
563 Image wanted;
564 for (const auto& sector : encoder.collectSectors(*ltl, image))
565 wanted
566 .put(sector->logicalCylinder,
567 sector->logicalHead,
568 sector->logicalSector)
569 ->data = sector->data;
570
571 for (const auto& sector : sectors)
572 {
573 const auto s = wanted.get(sector->logicalCylinder,
574 sector->logicalHead,
575 sector->logicalSector);
576 if (!s)
577 {
578 log("spurious sector on verify");
579 return false;
580 }
581 if (s->data != sector->data.slice(0, s->data.size()))
582 {
583 log("data mismatch on verify");
584 return false;
585 }
586 wanted.erase(sector->logicalCylinder,
587 sector->logicalHead,
588 sector->logicalSector);
589 }

Callers 1

writeDiskCommandFunction · 0.85

Calls 12

writeTracksFunction · 0.85
readGroupFunction · 0.85
adjustTrackOnErrorFunction · 0.85
collectSectorsMethod · 0.80
sliceMethod · 0.80
logFunction · 0.50
encodeMethod · 0.45
putMethod · 0.45
getMethod · 0.45
sizeMethod · 0.45
eraseMethod · 0.45
emptyMethod · 0.45

Tested by

no test coverage detected