         id->sem (atom {})
         id->result (atom {})
         id->start (atom {})
+        id->function (atom {})
+        id->request (atom {})
         request-queues (atom {})
         cleanup (fn [id] (swap! id->sem dissoc id)
                          (swap! id->result dissoc id)
+                         (swap! id->function dissoc id)
+                         (swap! id->request dissoc id)
                          (swap! id->start dissoc id))
         my-ip (.getHostAddress (InetAddress/getLocalHost))
         clear-thread (async-loop

              ]
          (swap! id->start assoc id (current-time-secs))
          (swap! id->sem assoc id sem)
          (.add queue req)
          (log-debug "Waiting for DRPC result for " function " " args " at " (System/currentTimeMillis))
          (.acquire sem)

                            (when-let [sem (@id->sem id)]
                              (swap! id->result assoc id (DRPCExecutionException. "Request timed out"))
                              (.release sem))
                              (.remove (acquire-queue request-queues (@id->function id)) (@id->request id))
                              (log-warn "Timeout DRPC request id: " id " start at " start)
                            (cleanup id)
                            ))
                        TIMEOUT-CHECK-SECS
