@@ -74,6 +74,9 @@ using namespace std;
7474
7575
7676namespace {
77+ static const uint64_t maxViewerBytes = 1e8 ;
78+
79+
7780 string idFromSig (const string &sig) {
7881 if (sig.empty ()) return " " ;
7982 return Digest::urlBase64 (sig, " sha256" );
@@ -677,43 +680,75 @@ void Unit::readInfo() {
677680
678681
679682void Unit::readViewerData () {
680- if (getState () < UNIT_CORE) return ;
681- if (topology.isNull ()) readViewerTop ();
682- if (readViewerFrame ()) triggerNext ();
683+ if (viewerFail < 0 || getState () < UNIT_CORE) return ;
684+
685+ try {
686+ if (topology.isNull ()) readViewerTop ();
687+ return readViewerFrame ();
688+ } CATCH_WARNING;
689+
690+ if (5 < ++viewerFail) {
691+ if (topology.isNull ()) {
692+ LOG_WARNING (" Giving up on reading visualization" );
693+ viewerFail = -1 ;
694+
695+ } else {
696+ LOG_WARNING (" Giving up on reading visualization frame " << viewerFrame++);
697+ viewerFail = 0 ;
698+ }
699+ }
683700}
684701
685702
686703void Unit::readViewerTop () {
687704 string filename = getDirectory () + " /viewerTop.json" ;
688705
689706 if (existsAndOlderThan (filename, 10 )) {
690- topology = JSON::Reader::parseFile (filename);
691707 frames.clear ();
708+ viewerBytes = SystemUtilities::getFileSize (filename);
709+
710+ if (maxViewerBytes < viewerBytes) {
711+ LOG_WARNING (" Visualization topology too large, disabling visualization" );
712+ viewerFail = -1 ;
713+ return ;
714+ }
715+
716+ topology = JSON::Reader::parseFile (filename);
717+ viewerFail = 0 ;
692718 }
693719}
694720
695721
696- bool Unit::readViewerFrame () {
722+ void Unit::readViewerFrame () {
697723 string filename =
698724 getDirectory () + String::printf (" /viewerFrame%d.json" , viewerFrame);
699725
700726 if (existsAndOlderThan (filename, 10 )) {
727+ uint64_t bytes = SystemUtilities::getFileSize (filename);
728+
729+ if (maxViewerBytes < viewerBytes + bytes) {
730+ LOG_WARNING (" Visualization size exceeded at frame " << viewerFrame
731+ << " , no more frames will be loaded" );
732+ viewerFail = -1 ;
733+ return ;
734+ }
735+
701736 auto frame = JSON::Reader::parseFile (filename);
702737
703738 if (!frames.empty () && *frames.back () == *frame)
704739 LOG_WARNING (" Visualization frame " << viewerFrame
705- << " unchanged, skipping" );
740+ << " unchanged, skipping" );
706741
707742 else if (!frame->empty ()) {
708743 frames.push_back (frame);
709744 insert (" frames" , (uint32_t )frames.size ());
745+ viewerBytes += bytes;
710746 }
711747
712748 viewerFrame++;
713- return true ;
749+ viewerFail = 0 ;
750+ triggerNext (); // Try to load another frame
714751 }
715-
716- return false ;
717752}
718753
719754
0 commit comments