From c6ed96347a1eed2d1242695e76bd07b969d8232b Mon Sep 17 00:00:00 2001
From: liliang <759628324@qq.com>
Date: Thu, 2 Nov 2023 10:53:54 +0800
Subject: [PATCH] fix #725

Signed-off-by: liliang <759628324@qq.com>
---
 .../qos/logback/core/AsyncAppenderBase.java   | 15 ++++--
 .../logback/core/AsyncAppenderBaseTest.java   | 52 +++++++++++++++++++
 2 files changed, 64 insertions(+), 3 deletions(-)

diff --git a/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java b/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java
index 0b13be0086..94e6454ac1 100755
--- a/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java
@@ -240,7 +240,7 @@ public boolean isNeverBlock() {
     /**
      * The remaining capacity available in the blocking queue.
      * <p>
-     * See also {@link java.util.concurrent.BlockingQueue#remainingCapacity()
+     * See also {@link BlockingQueue#remainingCapacity()
      * BlockingQueue#remainingCapacity()}
      *
      * @return the remaining capacity
@@ -275,14 +275,23 @@ public boolean isAttached(Appender<E> eAppender) {
 
     public void detachAndStopAllAppenders() {
         aai.detachAndStopAllAppenders();
+        appenderCount = 0;
     }
 
     public boolean detachAppender(Appender<E> eAppender) {
-        return aai.detachAppender(eAppender);
+        boolean detached = aai.detachAppender(eAppender);
+        if (detached) {
+            appenderCount --;
+        }
+        return detached;
     }
 
     public boolean detachAppender(String name) {
-        return aai.detachAppender(name);
+        boolean detached = aai.detachAppender(name);
+        if (detached) {
+            appenderCount --;
+        }
+        return detached;
     }
 
     class Worker extends Thread {
diff --git a/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java b/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java
index 6b9bd9a55c..a7b0765fe1 100755
--- a/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java
@@ -332,4 +332,56 @@ public void checkThatStartMethodIsIdempotent() {
         // thread
         asyncAppenderBase.start();
     }
+
+    // AsyncAppenderBase can not addAppender after detachAppender
+    @Test
+    @Timeout(value=2, unit = TimeUnit.SECONDS)
+    public void appenderShouldBeAddedSuccessfullyAfterDetachedByReference() {
+        asyncAppenderBase.addAppender(listAppender);
+        asyncAppenderBase.start();
+        asyncAppenderBase.doAppend(0);
+        asyncAppenderBase.detachAppender(listAppender);
+        asyncAppenderBase.addAppender(listAppender);
+        asyncAppenderBase.doAppend(0);
+        asyncAppenderBase.stop();
+        verify(listAppender, 2);
+    }
+
+    @Test
+    @Timeout(value=2, unit = TimeUnit.SECONDS)
+    public void appenderShouldBeAddedSuccessfullyAfterDetachedByName() {
+        asyncAppenderBase.addAppender(listAppender);
+        asyncAppenderBase.start();
+        asyncAppenderBase.doAppend(0);
+        asyncAppenderBase.detachAppender("list");
+        asyncAppenderBase.addAppender(listAppender);
+        asyncAppenderBase.doAppend(0);
+        asyncAppenderBase.stop();
+        verify(listAppender, 2);
+    }
+
+    @Test
+    @Timeout(value=2, unit = TimeUnit.SECONDS)
+    public void appenderShouldBeAddedSuccessfullyAfterAllAppendersDetachedAndStopeed() throws InterruptedException {
+        asyncAppenderBase.addAppender(listAppender);
+        asyncAppenderBase.start();
+        asyncAppenderBase.doAppend(0);
+        TimeUnit.SECONDS.sleep(1);
+        asyncAppenderBase.detachAndStopAllAppenders();
+
+        ListAppender<Integer> listAppender2 = new ListAppender<Integer>();
+        listAppender2.setContext(context);
+        listAppender2.setName("list2");
+        listAppender2.start();
+
+        asyncAppenderBase.addAppender(listAppender2);
+        asyncAppenderBase.doAppend(0);
+
+        asyncAppenderBase.stop();
+
+        verify(listAppender, 1);
+        verify(listAppender2, 1);
+
+    }
+
 }