]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
TES_HUNGRY doesn't inhibit export cleanup any more
authorMaria Matejka <mq@ucw.cz>
Tue, 11 Oct 2022 09:08:49 +0000 (11:08 +0200)
committerMaria Matejka <mq@ucw.cz>
Wed, 12 Oct 2022 08:05:16 +0000 (10:05 +0200)
nest/rt-table.c

index 37d0307ba27c8f13bc35c048459acb8ae0e56dcc..dad5d0cc3d2b9a43dfd4f010b6c14117cad9bd83 100644 (file)
@@ -3061,10 +3061,19 @@ rt_export_cleanup(struct rtable_private *tab)
   {
     switch (atomic_load_explicit(&eh->h.export_state, memory_order_acquire))
     {
-      case TES_DOWN:
-      case TES_HUNGRY:
+      /* Export cleanup while feeding isn't implemented */
+      case TES_FEEDING:
+       goto done;
+
+      /* States not interfering with export cleanup */
+      case TES_DOWN:   /* This should not happen at all */
+       log(L_WARN "%s: Export cleanup found hook %s in explicit state TES_DOWN", tab->name, eh->h.req->name);
+       /* fall through */
+      case TES_HUNGRY: /* Feeding waiting for uncork */
+      case TES_STOP:   /* No more export will happen on this hook */
        continue;
 
+      /* Regular export */
       case TES_READY:
        {
          struct rt_pending_export *last = atomic_load_explicit(&eh->last_export, memory_order_acquire);
@@ -3081,8 +3090,7 @@ rt_export_cleanup(struct rtable_private *tab)
        }
 
       default:
-       /* It's only safe to cleanup when the export state is idle or regular. No feeding or stopping allowed. */
-       goto done;
+       bug("%s: Strange export state of hook %s: %d", tab->name, eh->h.req->name, atomic_load_explicit(&eh->h.export_state, memory_order_relaxed));
     }
   }