From 325a5c413c5998c23800f6b39433a4350eea29e2 Mon Sep 17 00:00:00 2001 From: Mahima Singh <105724608+smahima27@users.noreply.github.com> Date: Wed, 24 Dec 2025 15:20:23 +0530 Subject: [PATCH] Revert status cache to use class variables with RuboCop exceptions Class variables are needed here because: - Cache must be shared across all Sinatra app instances - Class instance variables don't work in Sinatra's dynamic instantiation model - This is a valid use case for class variables despite RuboCop warning --- lib/vmpooler/api/v3.rb | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/lib/vmpooler/api/v3.rb b/lib/vmpooler/api/v3.rb index 4f0ace3..4349ef8 100644 --- a/lib/vmpooler/api/v3.rb +++ b/lib/vmpooler/api/v3.rb @@ -10,21 +10,16 @@ module Vmpooler api_prefix = "/api/v#{api_version}" # Simple in-memory cache for status endpoint - @status_cache = {} - @status_cache_mutex = Mutex.new + # rubocop:disable Style/ClassVars + @@status_cache = {} + @@status_cache_mutex = Mutex.new + # rubocop:enable Style/ClassVars STATUS_CACHE_TTL = 30 # seconds - class << self - attr_accessor :status_cache, :status_cache_mutex - end - - @status_cache ||= {} - @status_cache_mutex ||= Mutex.new - # Clear cache (useful for testing) def self.clear_status_cache - @status_cache_mutex.synchronize do - @status_cache.clear + @@status_cache_mutex.synchronize do + @@status_cache.clear end end @@ -485,8 +480,8 @@ module Vmpooler # Cache helper methods for status endpoint def get_cached_status(cache_key) - self.class.status_cache_mutex.synchronize do - cached = self.class.status_cache[cache_key] + @@status_cache_mutex.synchronize do + cached = @@status_cache[cache_key] if cached && (Time.now - cached[:timestamp]) < STATUS_CACHE_TTL return cached[:data] end @@ -496,8 +491,8 @@ module Vmpooler end def set_cached_status(cache_key, data) - self.class.status_cache_mutex.synchronize do - self.class.status_cache[cache_key] = { + @@status_cache_mutex.synchronize do + @@status_cache[cache_key] = { data: data, timestamp: Time.now }