Skip to content

InterProcessMutex is not releasing when called inside a future's onSuccess function. #285

Description

@ibanner56

We're trying to set up a lock for our Zookeeper operations, but when we attempt to call the release function, the entire application simply hangs on the call to release (that is, it prints the 'releasing lock' line, but not the 'lock released' line).

  get(byName) { request =>
    val topologyPromise = new Promise[ResponseBuilder]
    val topologyName = request.routeParams("name")
    val client = zkService.getCuratorClient
    val lock = new InterProcessMutex(client, s"${Config.ZOOKEEPER_APP_PATH}/locks/${topologyName.split("-")(0)}")
    if(lock.acquire(5, TimeUnit.SECONDS)){
      topologyService.getTopologyInfo(topologyName).onSuccess({ topology =>
        log.info("releasing lock")
        lock.release()
        log.info("lock released")
        topologyPromise.setValue(render.json(AppResponse(data = topology)))
      }).onFailure({ t: Throwable =>
        log.info(t.getMessage)
        lock.release()
        client.close()
        topologyPromise.setException(t)
      })
      }
    }
    else {
      log.info("No lock")
      topologyPromise.setValue(render.status(409).json(AppResponse(409, "Unable to acquire lock")))
    }

    topologyPromise
  }

If we use an await on the future, the release does not hang and releases correctly.

      try {
        val topology = Await.result(topologyService.getTopologyInfo(topologyName), Duration.fromMilliseconds(1000))
        topologyPromise.setValue(render.json(AppResponse(data = topology)))
      } catch { case ex: Exception =>
        topologyPromise.setException(ex)
      } finally {
        log.info("releasing lock")
        lock.release()
        log.info("lock released")
      }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions