@@ -128,7 +128,7 @@ void ChunkserverEntry::fwdError() {
128128 uint8_t status =
129129 (state == State::Connecting ? SAUNAFS_ERROR_CANTCONNECT : SAUNAFS_ERROR_DISCONNECTED);
130130 createAttachedWriteStatus (chunkId, status, 0 );
131- state = State::WriteFinish ;
131+ state = State::IOFinish ;
132132}
133133
134134int ChunkserverEntry::initConnection () {
@@ -334,7 +334,7 @@ void ChunkserverEntry::writeInit(const uint8_t *data, PacketHeader::Type type,
334334
335335 if (initConnection () < kInitConnectionOK ) {
336336 createAttachedWriteStatus (chunkId, SAUNAFS_ERROR_CANTCONNECT, 0 );
337- state = State::WriteFinish ;
337+ state = State::IOFinish ;
338338 return ;
339339 }
340340 } else {
@@ -373,7 +373,7 @@ void ChunkserverEntry::writeData(const uint8_t *data, PacketHeader::Type type,
373373
374374 if (status != SAUNAFS_STATUS_OK) {
375375 createAttachedWriteStatus (opChunkId, status, writeId);
376- state = State::WriteFinish ;
376+ state = State::IOFinish ;
377377 return ;
378378 }
379379
@@ -413,15 +413,15 @@ void ChunkserverEntry::writeEnd(const uint8_t *data, uint32_t length) {
413413 cltocs::writeEnd::deserialize (data, length, opChunkId);
414414 } catch (IncorrectDeserializationException&) {
415415 safs::log_info (" Received malformed WRITE_END message (length: {})" , length);
416- state = State::WriteFinish ;
416+ state = State::IOFinish ;
417417 return ;
418418 }
419419
420420 if (opChunkId != chunkId) {
421421 safs::log_info (
422422 " Received malformed WRITE_END message (got chunkId={:016X}, expected {:016X})" ,
423423 opChunkId, chunkId);
424- state = State::WriteFinish ;
424+ state = State::IOFinish ;
425425 return ;
426426 }
427427
@@ -434,7 +434,7 @@ void ChunkserverEntry::writeEnd(const uint8_t *data, uint32_t length) {
434434 // TODO(msulikowski) temporary syslog message. May be useful until this
435435 // code is fully tested
436436 safs::log_info (" Received WRITE_END message too early" );
437- state = State::WriteFinish ;
437+ state = State::IOFinish ;
438438 return ;
439439 }
440440
@@ -445,7 +445,15 @@ void ChunkserverEntry::writeEnd(const uint8_t *data, uint32_t length) {
445445
446446 // All went fine, cleanup
447447 writeHLO_->cleanup ();
448- state = State::Idle;
448+ if (workerJobPool->isFull ()) {
449+ // If the worker job pool is full, let's try not to accept more requests until it has some
450+ // free slots. IOFinish is just in case there are some packets pending to be sent (which
451+ // should not be the case).
452+ state = State::IOFinish;
453+ } else {
454+ // Ready for new requests, reset state
455+ state = State::Idle;
456+ }
449457}
450458
451459void ChunkserverEntry::sauGetChunkBlocks (const uint8_t *data, uint32_t length) {
@@ -676,13 +684,13 @@ void ChunkserverEntry::gotPacket(uint32_t type, const uint8_t *data,
676684 state = State::Close;
677685 break ;
678686 }
679- } else if (state == State::WriteFinish ) {
687+ } else if (state == State::IOFinish ) {
680688 switch (type) {
681689 case SAU_CLTOCS_WRITE_DATA:
682690 case SAU_CLTOCS_WRITE_END:
683691 return ;
684692 default :
685- safs::log_info (" Got invalid message in WriteFinish state (type:{})" , type);
693+ safs::log_info (" Got invalid message in IOFinish state (type:{})" , type);
686694 state = State::Close;
687695 }
688696 } else {
0 commit comments