Skip to content

Commit

Permalink
add idle time status
Browse files Browse the repository at this point in the history
  • Loading branch information
Aaron Peddle authored and Aaron Peddle committed Aug 28, 2023
1 parent d5db263 commit 780545b
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 17 deletions.
19 changes: 15 additions & 4 deletions potassium/potassium.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import time
from flask import Flask, request, make_response, abort
from werkzeug.serving import make_server
from threading import Thread, Lock, Condition
Expand Down Expand Up @@ -47,6 +48,7 @@ def __init__(self, name):
self._gpu_lock = Lock()
self._background_task_cv = Condition()
self._sequence_number = 0
self._idle_start_time = 0
self._flask_app = self._create_flask_app()

#
Expand Down Expand Up @@ -162,6 +164,7 @@ def _handle_generic(self, endpoint, flask_request):
res = make_response(tb_str)
res.status_code = 500
res.headers['X-Endpoint-Type'] = endpoint.type
self._idle_start_time = time.time()
self._gpu_lock.release()
elif endpoint.type == "background":
req = Request(
Expand All @@ -178,7 +181,8 @@ def task(endpoint, lock, req):
finally:
with self._background_task_cv:
self._background_task_cv.notify_all()
# release lock

self._idle_start_time = time.time()
lock.release()

thread = Thread(target=task, args=(endpoint, self._gpu_lock, req))
Expand Down Expand Up @@ -219,14 +223,20 @@ def handle(path):

@flask_app.route('/__status__', methods=["GET"])
def status():
idle_time = 0
gpu_available = not self._gpu_lock.locked()

if gpu_available:
idle_time = int((time.time() - self._idle_start_time)*1000)

res = make_response({
"gpu_available": not self._gpu_lock.locked(),
"sequence_number": self._sequence_number
"gpu_available": gpu_available,
"sequence_number": self._sequence_number,
"idle_time": idle_time
})

res.status_code = 200
res.headers['X-Endpoint-Type'] = "status"
res
return res

return flask_app
Expand All @@ -237,4 +247,5 @@ def serve(self, host="0.0.0.0", port=8000):
self._init_func()
server = make_server(host, port, self._flask_app)
print(colored(f"Serving at http://{host}:{port}\n------", 'green'))
self._idle_start_time = time.time()
server.serve_forever()
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from distutils.core import setup
import setuptools
from pathlib import Path

this_directory = Path(__file__).parent
Expand Down
24 changes: 12 additions & 12 deletions tests/test_endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,10 @@ def background(context: dict, request: potassium.Request):
res = client.get("/__status__", json={})

assert res.status_code == 200
assert res.json == {
"gpu_available": True,
"sequence_number": 0,
}
assert res.json is not None
assert res.json["gpu_available"] == True
assert res.json["sequence_number"] == 0
assert res.json["idle_time"] > 0

# send background post in separate thread
res = client.post("/background", json={})
Expand All @@ -108,10 +108,10 @@ def background(context: dict, request: potassium.Request):
res = client.get("/__status__", json={})

assert res.status_code == 200
assert res.json == {
"gpu_available": False,
"sequence_number": 1,
}
assert res.json is not None
assert res.json["gpu_available"] == False
assert res.json["sequence_number"] == 1
assert res.json["idle_time"] == 0

# notify background thread to continue
with resolve_background_condition:
Expand All @@ -124,10 +124,10 @@ def background(context: dict, request: potassium.Request):
res = client.get("/__status__", json={})

assert res.status_code == 200
assert res.json == {
"gpu_available": True,
"sequence_number": 1,
}
assert res.json is not None
assert res.json["gpu_available"] == True
assert res.json["sequence_number"] == 1
assert res.json["idle_time"] > 0

def test_wait_for_background_task():
app = potassium.Potassium("my_app")
Expand Down

0 comments on commit 780545b

Please sign in to comment.