Elevare Digital માં તમારો AI એજન્ટ નિષ્ક્રિય (idle) થઈ ગયો કારણ કે તાજેતરમાં ઉમેરવામાં આવેલી PostgreSQL row-level security (RLS) પોલિસીએ દરેક જોબ રો (job row) ને ફિલ્ટર કરી દીધી, જેના કારણે ક્યુ (queue) ખાલી દેખાવા લાગી. જ્યાં સુધી કામનો ભરાવો ન થયો ત્યાં સુધી આ ભૂલ ધ્યાનમાં આવી નહીં, જેના કારણે ટીમને ઓર્કેસ્ટ્રેટર (orchestrator) ખાલી ક્યુ કેવી રીતે શોધે છે તેનું રિડિઝાઇન કરવું પડ્યું.

છુપાયેલું અંધબિંદુ (blind spot)

ARIA, Elevare ની સ્વાયત્ત (autonomous) AI સિસ્ટમ, પેન્ડિંગ જોબ્સ માટે PostgreSQL ટેબલને પોલ (poll) કરે છે. ક્વેરી સફળ રહી, શૂન્ય રો (rows) પરત કર્યા, અને એજન્ટ નિષ્ક્રિય થઈ ગયો. વાસ્તવમાં ટેબલ ભરેલું હતું. એક RLS પોલિસીએ SELECT એક્સેસને વપરાશકર્તાઓના ચોક્કસ સેટ સુધી મર્યાદિત કરી દીધો હતો. ઓર્કેસ્ટ્રેટર એક સર્વિસ રોલ (service role) સાથે જોડાયેલું હતું જેની પાસે bypass પ્રિવિલેજ (privilege) નહોતો, તેથી ડેટાબેસે પરિણામ સેટમાંથી દરેક રો ને શાંતિથી દૂર કરી દીધી. PostgreSQL ફિલ્ટર કરેલી રીડને ખાલી ટેબલ સમાન ગણે છે, તેથી કોઈ એરર, વોર્નિંગ અથવા ફેઈલ્યોર કોડ દેખાયો નહીં. નિષ્ક્રિય એજન્ટ તરફથી મળતા હેલ્ધી હાર્ટબીટ (heartbeat) માંથી કંઈ પણ ખોટું છે તેનો કોઈ સંકેત મળ્યો નહીં.

RLS એ કેવી રીતે ભરેલી ક્યુને શાંતિમાં બદલી નાખી

RLS, SELECT દરમિયાન દરેક રો માં એક પ્રેડિકેટ (predicate) ઉમેરે છે. જો પ્રેડિકેટ ખોટું (false) હોય, તો તે રો પરિણામમાંથી અદૃશ્ય થઈ જાય છે. ક્લાયન્ટ ફક્ત એ જ રો જોઈ શકે છે જે પોલિસીનું પાલન કરે છે; તેને ક્યારેય ખબર પડતી નથી કે રો છુપાવવામાં આવ્યા હતા. ક્યુ વર્કર માટે, ખાલી રિઝલ્ટ સેટ બરાબર ખરેખર ખાલી ક્યુ જેવો જ લાગે છે. ઓર્કેસ્ટ્રેટરે “કોઈ રો નથી = કોઈ કામ નથી” એમ માની લીધું અને તેની idle લૂપમાં પ્રવેશી ગયું, જ્યારે પડદા પાછળ જોબ્સનો ભરાવો થતો રહ્યો.

ટીમને જાણવા મળ્યું કે વપરાશકર્તાઓને રીડ્સ મર્યાદિત કરવા માટે બનાવેલી પોલિસીએ અજાણતામાં સર્વિસ રોલને જ પકડી લીધો હતો. કારણ કે તે રોલ પાસે ખાસ “bypass RLS” એટ્રિબ્યુટ નહોતું, તેથી ઓર્કેસ્ટ્રેટર દ્વારા કરવામાં આવતી દરેક ક્વેરી પર પોલિસી લાગુ પડી. આ સુરક્ષા વિરુદ્ધ અવલોકનક્ષમતા (security-vs-observability) વચ્ચેના ક્લાસિક ટ્રેડ-ઓફ (trade-off) ને દર્શાવે છે: RLS અનધિકૃત વપરાશકર્તાઓથી ડેટાનું રક્ષણ કરે છે, પરંતુ તે વિઝિબિલિટી (visibility) પર આધાર રાખતા સિસ્ટમ ઘટકો માટે ઉપયોગી ફેઈલ્યોર સિગ્નલને પણ દૂર કરે છે.

કેનરી-ચેક પેટર્ન (canary-check pattern)

શાંત ખાલી પરિણામ પરની નિર્ભરતા તોડવા માટે, Elevare એ “canary” ચેક ઉમેર્યો. નવો ફ્લો આ મુજબ છે:

  1. પેન્ડિંગ-જોબ્સ ટેબલ ક્વેરી કરો.
  2. જો રો પરત મળે, તો પહેલાની જેમ જ તેને પ્રોસેસ કરો.
  3. જો પરિણામ ખાલી હોય, તો એક સમર્પિત (dedicated) કેનરી રો સામે બીજી ક્વેરી કરો જે હંમેશા હોવી જ જોઈએ.
  4. જો કેનરી ક્વેરી અપેક્ષિત રો પરત કરે, તો ક્યુ ખરેખર ખાલી છે; idle હાર્ટબીટ લોગ કરો.
  5. જો કેનરી ક્વેરી પણ કંઈ જ પરત ન કરે, તો એજન્ટ અંધ (blind) છે; તાત્કાલિક એલર્ટ આપો.

હવે ઓર્કેસ્ટ્રેટર ત્રણ સ્થિતિઓ વચ્ચે તફાવત કરી શકે છે:

  • જોબ્સ મળ્યા – સામાન્ય પ્રોસેસિંગ.
  • કોઈ જોબ્સ નથી, કેનરી OK છે – સાચો નિષ્ક્રિય સમયગાળો.
  • કોઈ જોબ્સ નથી, કેનરી નિષ્ફળ ગઈ – છુપાયેલ RLS બ્લોક, એલર્ટ ટ્રિગર કરો.

કેનરી ટેબલ એ એક સિંગલ રો છે જે ક્યારેય બદલાતી નથી. તેને સેટ કરવામાં લગભગ એક કલાક લાગ્યો, પરંતુ તે શાંત ફેઈલ્યોરના આખા પ્રકારને દૂર કરે છે.

ટીમોએ શું કરવું જોઈએ

જો તમે PostgreSQL અથવા તેના પર બનેલી હોસ્ટેડ સર્વિસ (જેમ કે Supabase) સામે ક્યુ વર્કર્સ ચલાવો છો, તો આ પગલાં અનુસરો:

  • “bypass RLS” ફ્લેગ સાથે સર્વિસ-રોલ ક્રેડેન્શિયલનો ઉપયોગ કરો. આ સિસ્ટમ ઘટકોને વપરાશકર્તા-સ્તરની પોલિસીઓ ગમે તે હોય, તમામ રો જોવા દે છે.
  • સર્વિસ રોલ માટે ખૂટતી bypass પરમિશન માટે RLS પોલિસીઓનું ઓડિટ કરો. જે પોલિસી અંતિમ વપરાશકર્તાઓ માટે સાચી લાગે છે તે અજાણતામાં આંતરિક સેવાઓને ફસાવી શકે છે.
  • કેનરી ટેબલ ઉમેરો (અથવા સમાન હંમેશા હાજર રહે તેવો રો) અને વર્કરના idle લોજિકમાં કેનરી ચેકનો સમાવેશ કરો. વધારાની ક્વેરી સસ્તી છે અને સ્પષ્ટ સેફ્ટી નેટ પૂરી પાડે છે.

ટ્રેડ-ઓફ (The trade-off)

RLS એ ફાઇન-ગ્રેઇન્ડ (fine-grained) ડેટા એક્સેસ લાગુ કરવા માટે એક શક્તિશાળી સાધન છે. તે અકસ્માતજન્ય ડેટા લીક અટકાવે છે અને કોડબેઝમાં એપ્લિકેશન-સ્તરના ફિલ્ટર્સ વેર્યા વગર મલ્ટી-ટેનન્ટ આર્કિટેક્ચરને સપોર્ટ કરે છે. તેનો ગેરફાયદો એ છે કે તે એવા ઘટકોથી નિષ્ફળતાઓને છુપાવી શકે છે જે “કોઈ રો નથી” ના સિગ્નલનો અર્થ “કંઈ કરવા માટે નથી” એવો લે છે. કેનરી પેટર્ન RLS ને નબળું પાડતી નથી; તે એક હળવું વેરિફિકેશન સ્ટેપ ઉમેરે છે જે અવલોકનક્ષમતા (observability) પુનઃસ્થાપિત કરે છે.

મુખ્ય વાત (Takeaway)

એક છુપાયેલી RLS પોલિસી વ્યસ્ત ક્યુને શાંત ડેડ એન્ડમાં બદલી શકે છે, જેનાથી કામનો ભરાવો થતો રહે અને AI એજન્ટો નિષ્ક્રિય રહે છે. સર્વિસ રોલને યોગ્ય bypass પ્રિવિલેજ આપો અને દરેક ખાલી-ક્યુ રીડને કેનરી ચેક સાથે જોડો; ટીમો તેમના સ્વાયત્ત વર્કર્સને સચોટ રાખી શકે છે અને ખર્ચાળ અંધબિંદુઓથી બચી શકે છે.