summaryrefslogtreecommitdiffstats
path: root/src/server/integrity.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/integrity.c')
-rw-r--r--src/server/integrity.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/server/integrity.c b/src/server/integrity.c
index fddb755..2058104 100644
--- a/src/server/integrity.c
+++ b/src/server/integrity.c
@@ -78,15 +78,17 @@ void integrity_shutdown()
* make sure it is before calling, otherwise it will result in falsely
* detected corruption.
*/
-void integrity_check(dnbd3_image_t *image, int block)
+void integrity_check(dnbd3_image_t *image, int block, bool blocking)
{
+ int freeSlot;
if ( !bRunning ) {
logadd( LOG_MINOR, "Ignoring check request; thread not running..." );
return;
}
- int i, freeSlot = -1;
+start_over:
+ freeSlot = -1;
mutex_lock( &integrityQueueLock );
- for (i = 0; i < queueLen; ++i) {
+ for (int i = 0; i < queueLen; ++i) {
if ( freeSlot == -1 && checkQueue[i].image == NULL ) {
freeSlot = i;
} else if ( checkQueue[i].image == image && checkQueue[i].block <= block ) {
@@ -105,8 +107,13 @@ void integrity_check(dnbd3_image_t *image, int block)
}
}
if ( freeSlot == -1 ) {
- if ( queueLen >= CHECK_QUEUE_SIZE ) {
+ if ( unlikely( queueLen >= CHECK_QUEUE_SIZE ) ) {
mutex_unlock( &integrityQueueLock );
+ if ( blocking ) {
+ logadd( LOG_INFO, "Check queue full, waiting a couple seconds...\n" );
+ sleep( 3 );
+ goto start_over;
+ }
logadd( LOG_INFO, "Check queue full, discarding check request...\n" );
return;
}
@@ -206,7 +213,7 @@ static void* integrity_main(void * data UNUSED)
// If this is not a full check, queue one
if ( qCount != CHECK_ALL ) {
logadd( LOG_INFO, "Queueing full check for %s", image->name );
- integrity_check( image, -1 );
+ integrity_check( image, -1, false );
}
foundCorrupted = true;
}