Program: 8331
Project: 8331
Buggy source:
@Override public void subscribe(final Subscriber<? super T> s){
  if (subscribers.add(s)) {
    observable.subscribe(new rx.Subscriber<T>(){
      private final AtomicBoolean done=new AtomicBoolean();
      private void doRequest(      long n){
        if (!done.get()) {
          request(n);
        }
      }
      @Override public void onStart(){
        final AtomicBoolean requested=new AtomicBoolean();
        s.onSubscribe(new Subscription(){
          @Override public void request(          long n){
            if (n < 1) {
              unsubscribe();
              onError(new IllegalArgumentException("String_Node_Str"));
            }
            requested.set(true);
            doRequest(n);
          }
          @Override public void cancel(){
            unsubscribe();
            fireDone();
          }
        }
);
        if (!requested.get()) {
          request(0);
        }
      }
      private boolean fireDone(){
        boolean first=done.compareAndSet(false,true);
        if (first) {
          subscribers.remove(s);
        }
        return first;
      }
      @Override public void onCompleted(){
        if (fireDone()) {
          s.onComplete();
        }
      }
      @Override public void onError(      Throwable e){
        if (fireDone()) {
          s.onError(e);
        }
      }
      @Override public void onNext(      T t){
        if (!done.get()) {
          s.onNext(t);
        }
      }
    }
);
  }
 else {
    s.onError(new IllegalArgumentException("String_Node_Str"));
  }
}

Fixed version (ground truth):
@Override public void subscribe(final Subscriber<? super T> s){
  if (subscribers.putIfAbsent(s,s) == null) {
    observable.subscribe(new rx.Subscriber<T>(){
      private final AtomicBoolean done=new AtomicBoolean();
      private final AtomicLong childRequested=new AtomicLong();
      private void doRequest(      long n){
        if (!done.get()) {
          BackpressureUtils.getAndAddRequest(childRequested,n);
          request(n);
        }
      }
      @Override public void onStart(){
        final AtomicBoolean requested=new AtomicBoolean();
        s.onSubscribe(new Subscription(){
          @Override public void request(          long n){
            if (n < 1) {
              unsubscribe();
              onError(new IllegalArgumentException("String_Node_Str"));
              return;
            }
            requested.set(true);
            doRequest(n);
          }
          @Override public void cancel(){
            unsubscribe();
            fireDone();
          }
        }
);
        if (!requested.get()) {
          request(0);
        }
      }
      private boolean fireDone(){
        boolean first=done.compareAndSet(false,true);
        if (first) {
          subscribers.remove(s);
        }
        return first;
      }
      @Override public void onCompleted(){
        if (fireDone()) {
          s.onComplete();
        }
      }
      @Override public void onError(      Throwable e){
        if (fireDone()) {
          s.onError(e);
        }
      }
      @Override public void onNext(      T t){
        if (!done.get()) {
          if (childRequested.get() > 0) {
            s.onNext(t);
            childRequested.decrementAndGet();
          }
 else {
            try {
              onError(new IllegalStateException("String_Node_Str"));
            }
  finally {
              unsubscribe();
            }
          }
        }
      }
    }
);
  }
 else {
    s.onError(new IllegalArgumentException("String_Node_Str"));
  }
}