ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ# coding=utf-8 # # Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2023 All Rights Reserved # # Licensed under CLOUD LINUX LICENSE AGREEMENT # http://cloudlinux.com/docs/LICENSE.TXT import contextlib from typing import Any, TypedDict, Callable from threading import Thread, Event import sqlalchemy as sa from lvestats.orm import BurstingEventType, bursting_events_table from ..common import LveId, Timestamp def init_db_schema(engine: sa.engine.Engine) -> None: bursting_events_table.create(engine, checkfirst=True) def drop_db_schema(engine: sa.engine.Engine) -> None: bursting_events_table.drop(engine, checkfirst=True) class InBurstingEventRow(TypedDict): lve_id: LveId timestamp: Timestamp event_type: BurstingEventType @contextlib.contextmanager def thread_running(name: str, main: Callable[[Event], Any]): terminate = Event() (saver_thread := Thread( name=name, target=main, # NOTE(vlebedev): For details regarding how this interacts with termination using "atexit" callback, # have a look at https://stackoverflow.com/a/58928213/3344105 daemon=True, args=(terminate,), )).start() try: yield finally: terminate.set() saver_thread.join()