Fixing bugs in communication.

- The reporter can't be used from the child process.

- Don't attempt to send a zero-sized chunk when remote print buffer is
  empty.
This commit is contained in:
Robin Sommer 2011-07-01 18:49:15 -07:00
parent b520f98541
commit 4580bef3e6
4 changed files with 29 additions and 16 deletions

View file

@ -195,7 +195,7 @@ bool ChunkedIOFd::WriteChunk(Chunk* chunk, bool partial)
assert(chunk->len <= BUFFER_SIZE - sizeof(uint32) ); assert(chunk->len <= BUFFER_SIZE - sizeof(uint32) );
if ( chunk->len == 0 ) if ( chunk->len == 0 )
reporter->InternalError("attempt to write 0 bytes chunk"); InternalError("attempt to write 0 bytes chunk");
if ( partial ) if ( partial )
chunk->len |= FLAG_PARTIAL; chunk->len |= FLAG_PARTIAL;
@ -285,7 +285,7 @@ bool ChunkedIOFd::FlushWriteBuffer()
} }
if ( written == 0 ) if ( written == 0 )
reporter->InternalError("written==0"); InternalError("written==0");
// Short write. // Short write.
write_pos += written; write_pos += written;
@ -906,7 +906,7 @@ bool ChunkedIOSSL::WriteData(char* p, uint32 len, bool* error)
return false; return false;
} }
reporter->InternalError("can't be reached"); InternalError("can't be reached");
return false; return false;
} }
@ -1026,7 +1026,7 @@ bool ChunkedIOSSL::ReadData(char* p, uint32 len, bool* error)
} }
// Can't be reached. // Can't be reached.
reporter->InternalError("can't be reached"); InternalError("can't be reached");
return false; return false;
} }

View file

@ -120,6 +120,11 @@ public:
#endif #endif
protected: protected:
void InternalError(const char* msg)
// We can't use the reporter here as we might be running in a
// sub-process.
{ fprintf(stderr, "%s", msg); abort(); }
Statistics stats; Statistics stats;
const char* tag; const char* tag;

View file

@ -2375,7 +2375,7 @@ bool RemoteSerializer::FlushPrintBuffer(Peer* p)
if ( p->state == Peer::CLOSING ) if ( p->state == Peer::CLOSING )
return false; return false;
if ( ! p->print_buffer ) if ( ! (p->print_buffer && p->print_buffer_used) )
return true; return true;
SendToChild(MSG_REMOTE_PRINT, p, p->print_buffer, p->print_buffer_used); SendToChild(MSG_REMOTE_PRINT, p, p->print_buffer, p->print_buffer_used);
@ -3407,11 +3407,11 @@ bool SocketComm::ProcessParentMessage()
} }
default: default:
reporter->InternalError("unknown msg type %d", parent_msgtype); InternalError(fmt("unknown msg type %d", parent_msgtype));
return true; return true;
} }
reporter->InternalError("cannot be reached"); InternalError("cannot be reached");
} }
case ARGS: case ARGS:
@ -3434,10 +3434,10 @@ bool SocketComm::ProcessParentMessage()
} }
default: default:
reporter->InternalError("unknown msgstate"); InternalError("unknown msgstate");
} }
reporter->InternalError("cannot be reached"); InternalError("cannot be reached");
return false; return false;
} }
@ -3496,7 +3496,7 @@ bool SocketComm::DoParentMessage()
peers[j]->io->DumpDebugData(fmt("comm-dump.child.peer.%d", id), false); peers[j]->io->DumpDebugData(fmt("comm-dump.child.peer.%d", id), false);
} }
#else #else
reporter->InternalError("DEBUG_DUMP support not compiled in"); InternalError("DEBUG_DUMP support not compiled in");
#endif #endif
return true; return true;
} }
@ -3556,10 +3556,10 @@ bool SocketComm::DoParentMessage()
return ForwardChunkToPeer(); return ForwardChunkToPeer();
default: default:
reporter->InternalError("ProcessParentMessage: unexpected state"); InternalError("ProcessParentMessage: unexpected state");
} }
reporter->InternalError("cannot be reached"); InternalError("cannot be reached");
return false; return false;
} }
@ -3620,7 +3620,7 @@ bool SocketComm::ProcessListen()
bool SocketComm::ProcessParentCompress() bool SocketComm::ProcessParentCompress()
{ {
#ifndef HAVE_LIBZ #ifndef HAVE_LIBZ
reporter->InternalError("supposed to enable compression but don't have zlib"); InternalError("supposed to enable compression but don't have zlib");
return false; return false;
#else #else
@ -3740,11 +3740,10 @@ bool SocketComm::ProcessRemoteMessage(SocketComm::Peer* peer)
} }
default: default:
reporter->InternalError("ProcessRemoteMessage: unexpected state"); InternalError("ProcessRemoteMessage: unexpected state");
} }
assert(false); // Cannot be reached. return true;
return false;
} }
bool SocketComm::ForwardChunkToParent(Peer* peer, ChunkedIO::Chunk* c) bool SocketComm::ForwardChunkToParent(Peer* peer, ChunkedIO::Chunk* c)
@ -4051,6 +4050,12 @@ void SocketComm::Log(const char* msg, Peer* peer)
DEBUG_COMM(fmt("child: %s", buffer)); DEBUG_COMM(fmt("child: %s", buffer));
} }
void SocketComm::InternalError(const char* msg)
{
fprintf(stderr, "interal error in child: %s\n", msg);
Kill();
}
void SocketComm::Kill() void SocketComm::Kill()
{ {
if ( killing ) if ( killing )

View file

@ -463,6 +463,9 @@ protected:
// Check whether everything has been sent out. // Check whether everything has been sent out.
void CheckFinished(); void CheckFinished();
// Reports the error and terminates the process.
void InternalError(const char* msg);
// Communication helpers. // Communication helpers.
bool SendToParent(char type, Peer* peer, const char* str, int len = -1); bool SendToParent(char type, Peer* peer, const char* str, int len = -1);
bool SendToParent(char type, Peer* peer, int nargs, ...); // can send uints32 only bool SendToParent(char type, Peer* peer, int nargs, ...); // can send uints32 only