mirror of
https://github.com/zeek/zeek.git
synced 2025-10-13 03:58:20 +00:00
try to make ascii reader a little bit more robust to failure - mainly ignore messages after a reader has disabled itself
This commit is contained in:
parent
d5b413c4e7
commit
531189b5fd
3 changed files with 31 additions and 4 deletions
|
@ -203,6 +203,9 @@ bool ReaderBackend::Init(string arg_source, int mode, bool arg_autostart)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReaderBackend::StartReading() {
|
bool ReaderBackend::StartReading() {
|
||||||
|
if ( disabled )
|
||||||
|
return false;
|
||||||
|
|
||||||
int success = DoStartReading();
|
int success = DoStartReading();
|
||||||
|
|
||||||
if ( success == false ) {
|
if ( success == false ) {
|
||||||
|
@ -215,6 +218,9 @@ bool ReaderBackend::StartReading() {
|
||||||
bool ReaderBackend::AddFilter(int id, int arg_num_fields,
|
bool ReaderBackend::AddFilter(int id, int arg_num_fields,
|
||||||
const Field* const * arg_fields)
|
const Field* const * arg_fields)
|
||||||
{
|
{
|
||||||
|
if ( disabled )
|
||||||
|
return false;
|
||||||
|
|
||||||
bool success = DoAddFilter(id, arg_num_fields, arg_fields);
|
bool success = DoAddFilter(id, arg_num_fields, arg_fields);
|
||||||
if ( success && autostart) {
|
if ( success && autostart) {
|
||||||
autostart = false;
|
autostart = false;
|
||||||
|
@ -225,6 +231,9 @@ bool ReaderBackend::AddFilter(int id, int arg_num_fields,
|
||||||
|
|
||||||
bool ReaderBackend::RemoveFilter(int id)
|
bool ReaderBackend::RemoveFilter(int id)
|
||||||
{
|
{
|
||||||
|
if ( disabled )
|
||||||
|
return false;
|
||||||
|
|
||||||
bool success = DoRemoveFilter(id);
|
bool success = DoRemoveFilter(id);
|
||||||
SendOut(new FilterRemovedMessage(frontend, id));
|
SendOut(new FilterRemovedMessage(frontend, id));
|
||||||
return success; // yes, I know, noone reads this.
|
return success; // yes, I know, noone reads this.
|
||||||
|
@ -240,11 +249,20 @@ void ReaderBackend::Finish()
|
||||||
|
|
||||||
bool ReaderBackend::Update()
|
bool ReaderBackend::Update()
|
||||||
{
|
{
|
||||||
return DoUpdate();
|
if ( disabled )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool success = DoUpdate();
|
||||||
|
if ( !success ) {
|
||||||
|
DisableFrontend();
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReaderBackend::DisableFrontend()
|
void ReaderBackend::DisableFrontend()
|
||||||
{
|
{
|
||||||
|
disabled = true; // we also set disabled here, because there still may be other messages queued and we will dutifully ignore these from now
|
||||||
SendOut(new DisableMessage(frontend));
|
SendOut(new DisableMessage(frontend));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -177,7 +177,12 @@ protected:
|
||||||
*
|
*
|
||||||
* A reader implementation must override this method but it can just ignore
|
* A reader implementation must override this method but it can just ignore
|
||||||
* calls, if a forced update does not fit the input source or the current input
|
* calls, if a forced update does not fit the input source or the current input
|
||||||
* reading mode
|
* reading mode.
|
||||||
|
*
|
||||||
|
* If it returns false, it will be assumed that a fatal error has occured
|
||||||
|
* that prevents the reader from further operation; it will then be
|
||||||
|
* disabled and eventually deleted. When returning false, an implementation
|
||||||
|
* should also call Error to indicate what happened.
|
||||||
*/
|
*/
|
||||||
virtual bool DoUpdate() = 0;
|
virtual bool DoUpdate() = 0;
|
||||||
|
|
||||||
|
|
|
@ -458,7 +458,10 @@ bool Ascii::DoUpdate() {
|
||||||
if ( file && file->is_open() ) {
|
if ( file && file->is_open() ) {
|
||||||
if ( mode == STREAM ) {
|
if ( mode == STREAM ) {
|
||||||
file->clear(); // remove end of file evil bits
|
file->clear(); // remove end of file evil bits
|
||||||
ReadHeader(true); // in case filters changed
|
if ( !ReadHeader(true) ) // in case filters changed
|
||||||
|
{
|
||||||
|
return false; // header reading failed
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
file->close();
|
file->close();
|
||||||
|
@ -522,6 +525,7 @@ bool Ascii::DoUpdate() {
|
||||||
|
|
||||||
Value* val = EntryToVal(stringfields[(*fit).position], *fit);
|
Value* val = EntryToVal(stringfields[(*fit).position], *fit);
|
||||||
if ( val == 0 ) {
|
if ( val == 0 ) {
|
||||||
|
Error("Could not convert String value to Val");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -580,7 +584,7 @@ bool Ascii::DoHeartbeat(double network_time, double current_time)
|
||||||
break;
|
break;
|
||||||
case REREAD:
|
case REREAD:
|
||||||
case STREAM:
|
case STREAM:
|
||||||
DoUpdate();
|
Update(); // call update and not DoUpdate, because update actually checks disabled.
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue