Skip to content

Commit 98cb0ad

Browse files
committed
feat: remove pg_cron dependency and related scheduling logic for improved flexibility
1 parent 31facf7 commit 98cb0ad

5 files changed

Lines changed: 9 additions & 117 deletions

File tree

alembic/versions/d5e6f7a8b9c0_create_pygeoapi_supporting_views.py

Lines changed: 0 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
branch_labels: Union[str, Sequence[str], None] = None
1818
depends_on: Union[str, Sequence[str], None] = None
1919
REFRESH_FUNCTION_NAME = "refresh_pygeoapi_materialized_views"
20-
REFRESH_JOB_NAME = "refresh_pygeoapi_matviews_nightly"
21-
REFRESH_SCHEDULE = "0 3 * * *"
2220

2321
THING_COLLECTIONS = [
2422
("water_wells", "water well"),
@@ -231,68 +229,6 @@ def _create_refresh_function() -> str:
231229
"""
232230

233231

234-
def _schedule_refresh_job() -> str:
235-
return f"""
236-
DO $do$
237-
BEGIN
238-
BEGIN
239-
-- Avoid direct SELECT on cron.job because managed Postgres
240-
-- environments may deny access to the cron schema table.
241-
PERFORM cron.unschedule('{REFRESH_JOB_NAME}');
242-
EXCEPTION
243-
WHEN undefined_function THEN
244-
NULL;
245-
WHEN invalid_parameter_value THEN
246-
NULL;
247-
WHEN internal_error THEN
248-
-- Some pg_cron builds raise internal_error when the named
249-
-- job does not exist. Treat this as already-unscheduled.
250-
NULL;
251-
WHEN insufficient_privilege THEN
252-
RAISE NOTICE
253-
'Skipping pg_cron unschedule for % due to insufficient privileges.',
254-
'{REFRESH_JOB_NAME}';
255-
RETURN;
256-
END;
257-
258-
PERFORM cron.schedule(
259-
'{REFRESH_JOB_NAME}',
260-
'{REFRESH_SCHEDULE}',
261-
$cmd$SELECT public.{REFRESH_FUNCTION_NAME}();$cmd$
262-
);
263-
EXCEPTION
264-
WHEN insufficient_privilege THEN
265-
RAISE NOTICE
266-
'Skipping pg_cron schedule for % due to insufficient privileges.',
267-
'{REFRESH_JOB_NAME}';
268-
END
269-
$do$;
270-
"""
271-
272-
273-
def _unschedule_refresh_job() -> str:
274-
return f"""
275-
DO $do$
276-
BEGIN
277-
BEGIN
278-
PERFORM cron.unschedule('{REFRESH_JOB_NAME}');
279-
EXCEPTION
280-
WHEN undefined_function THEN
281-
NULL;
282-
WHEN invalid_parameter_value THEN
283-
NULL;
284-
WHEN internal_error THEN
285-
NULL;
286-
WHEN insufficient_privilege THEN
287-
RAISE NOTICE
288-
'Skipping pg_cron unschedule for % due to insufficient privileges.',
289-
'{REFRESH_JOB_NAME}';
290-
END;
291-
END
292-
$do$;
293-
"""
294-
295-
296232
def upgrade() -> None:
297233
bind = op.get_bind()
298234
inspector = inspect(bind)
@@ -307,16 +243,6 @@ def upgrade() -> None:
307243
f"tables are missing: {missing_tables_str}"
308244
)
309245

310-
pg_cron_available = bind.execute(
311-
text(
312-
"SELECT EXISTS ("
313-
"SELECT 1 FROM pg_available_extensions WHERE name = 'pg_cron'"
314-
")"
315-
)
316-
).scalar()
317-
if pg_cron_available:
318-
op.execute(text("CREATE EXTENSION IF NOT EXISTS pg_cron"))
319-
320246
for view_id, thing_type in THING_COLLECTIONS:
321247
safe_view_id = _safe_view_id(view_id)
322248
op.execute(text(f"DROP VIEW IF EXISTS ogc_{safe_view_id}"))
@@ -360,21 +286,9 @@ def upgrade() -> None:
360286
_create_matview_indexes()
361287

362288
op.execute(text(_create_refresh_function()))
363-
if pg_cron_available:
364-
op.execute(text(_schedule_refresh_job()))
365289

366290

367291
def downgrade() -> None:
368-
bind = op.get_bind()
369-
pg_cron_available = bind.execute(
370-
text(
371-
"SELECT EXISTS ("
372-
"SELECT 1 FROM pg_available_extensions WHERE name = 'pg_cron'"
373-
")"
374-
)
375-
).scalar()
376-
if pg_cron_available:
377-
op.execute(text(_unschedule_refresh_job()))
378292
op.execute(text(f"DROP FUNCTION IF EXISTS public.{REFRESH_FUNCTION_NAME}()"))
379293
_drop_view_or_materialized_view("ogc_avg_tds_wells")
380294
_drop_view_or_materialized_view("ogc_latest_depth_to_water_wells")

core/initializers.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
# ===============================================================================
16-
from pathlib import Path
1716
import os
17+
from pathlib import Path
1818

1919
from fastapi_pagination import add_pagination
2020
from sqlalchemy import text, select
@@ -66,15 +66,6 @@ def erase_and_rebuild_db():
6666
session.execute(text("DROP SCHEMA public CASCADE"))
6767
session.execute(text("CREATE SCHEMA public"))
6868
session.execute(text("CREATE EXTENSION IF NOT EXISTS postgis"))
69-
pg_cron_available = session.execute(
70-
text(
71-
"SELECT EXISTS ("
72-
"SELECT 1 FROM pg_available_extensions WHERE name = 'pg_cron'"
73-
")"
74-
)
75-
).scalar()
76-
if pg_cron_available:
77-
session.execute(text("CREATE EXTENSION IF NOT EXISTS pg_cron"))
7869
session.commit()
7970
Base.metadata.drop_all(session.bind)
8071
Base.metadata.create_all(session.bind)

db/initialization.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010

1111
from db import Base
1212

13-
APP_READ_GRANT_SQL = text("""
13+
APP_READ_GRANT_SQL = text(
14+
"""
1415
DO $$
1516
BEGIN
1617
IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'app_read') THEN
@@ -19,7 +20,8 @@
1920
EXECUTE 'ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO app_read';
2021
END IF;
2122
END $$;
22-
""")
23+
"""
24+
)
2325

2426

2527
def _parse_app_read_members() -> list[str]:
@@ -46,14 +48,16 @@ def grant_app_read_members(executor: Session | Connection | None) -> None:
4648
for member in members:
4749
safe_member = member.replace("'", "''")
4850
quoted = f'"{safe_member}"'
49-
stmt = text(f"""
51+
stmt = text(
52+
f"""
5053
DO $$
5154
BEGIN
5255
IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = '{safe_member}') THEN
5356
EXECUTE 'GRANT app_read TO {quoted}';
5457
END IF;
5558
END $$;
56-
""")
59+
"""
60+
)
5761
executor.execute(stmt)
5862

5963

@@ -62,15 +66,6 @@ def recreate_public_schema(session: Session) -> None:
6266
session.execute(text("DROP SCHEMA public CASCADE"))
6367
session.execute(text("CREATE SCHEMA public"))
6468
session.execute(text("CREATE EXTENSION IF NOT EXISTS postgis"))
65-
pg_cron_available = session.execute(
66-
text(
67-
"SELECT EXISTS ("
68-
"SELECT 1 FROM pg_available_extensions WHERE name = 'pg_cron'"
69-
")"
70-
)
71-
).scalar()
72-
if pg_cron_available:
73-
session.execute(text("CREATE EXTENSION IF NOT EXISTS pg_cron"))
7469
session.execute(APP_READ_GRANT_SQL)
7570
grant_app_read_members(session)
7671
session.commit()

docker-compose.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ services:
66
context: .
77
dockerfile: ./docker/db/Dockerfile
88
platform: linux/amd64
9-
command: >
10-
postgres
11-
-c shared_preload_libraries=pg_cron
12-
-c cron.database_name=${POSTGRES_DB}
139
environment:
1410
- POSTGRES_USER=${POSTGRES_USER}
1511
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

docker/db/Dockerfile

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1 @@
11
FROM postgis/postgis:17-3.5
2-
3-
RUN apt-get update \
4-
&& apt-get install -y --no-install-recommends postgresql-17-cron \
5-
&& rm -rf /var/lib/apt/lists/*

0 commit comments

Comments
 (0)