OpenAI

2 ኖቬምበር 2026

ምህንድስና

በOpenAI የGit አቅምን ማስፋት

በGit ሥነ ምህዳር ላይ መዋዕለ ንዋይ እያፈሰስን፣ የወኪሎችን የሥራ መጠን የሚያስተናግድ የምንጭ ኮድ ቁጥጥር ሥርዓት መገንባት።

በቴክኒክ ሠራተኞች አባላት አሮን ፍሪል፣ ቴይለር ብላው እና ቴድ ናይማን

በመጫን ላይ…

ባለፈው ዓመት፣ የተዋሃደ የኮድ ማከማቻችን መጠንና በእሱ ላይ የሚቀርቡ ፍላጎቶች በአስገራሚ ፍጥነት ጨምረዋል። Codex እውን ያደረገውን በአንድ ጊዜ የሚከናወን ሥራ መጠን ለማስተናገድ፣ የምንጭ ኮድ ቁጥጥር ሥርዓታችንን ማደስ እንደነበረብን ግልጽ ነበር።

ማንኛውንም የምህንድስና ሥራ ሳናቋርጥ ወይም ቡድናችን Gitን የሚጠቀምበትን መንገድ ሳንቀይር፣ ለGit ማከማቻዎች አዲስ የጀርባ ሥርዓት የሆነውን Pandoን ገነባን። አሁን በOpenAI የተዋሃደ የኮድ ማከማቻ ውስጥ የሚከናወነውን ሁሉንም ልማት Pando ያስተናግዳል። Pando ሁለት ታላላቅ ግቦችን ለማሳካት ተነድፏል፦ የመጀመሪያው፣ ተጨማሪ ማሽኖችን በመጨመር የሚሰፋና ወደ ብዙ ቅርንጫፎች በአንድ ጊዜ ለመላክ የተመቻቸ የመጻፍ አቅም ነው። ሁለተኛው ደግሞ፣ ደንበኞች ያላቸውን የአውታረ መረብ ባንድዊድዝ ሙሉ በሙሉ በሚጠቀም ፍጥነት ውሂብ እንዲያወርዱ፣ የማንበብ የማስተላለፊያ ዘዴን ከፍ ማድረግ ነው።

ከGit ፕሮቶኮልና ደንበኛ ጋር ያለውን ተኳኋኝነት ጠብቀን እነዚህን ግቦች አሳክተናል። ይህም መሐንዲሶቻችንና ወኪሎቻችን Pandoን በነባር የሥራ ፍሰቶቻቸው ውስጥ ያለችግር እንዲጠቀሙ አስችሏል። በተግባራዊ አገልግሎት ውስጥ፣ Pando መካከለኛውን የመላክ መዘግየት ወደ አንድ አምስተኛ ገደማ ቀንሶታል። አሁን በቀን ወደ አንድ ፔታባይት የሚጠጋ የGit ውሂብ ያቀርባል።

እዚህ፣ አዲስ የምንጭ ኮድ ቁጥጥር ሥርዓት ለመገንባት ያነሳሱንን ምክንያቶችና ከGit ጋር ተኳኋኝነትን ለመጠበቅ ለምን እንደመረጥን እናብራራለን። ሥርዓታችንን የGit አቅምን ለማስፋት ከሚጠቀሙ የተለመዱ አቀራረቦች ጋር በማነጻጸር፣ Pando የOpenAIን የመስፋፋት ፍላጎቶች በልዩ ሁኔታ ማሟላት የሚችልበትን ምክንያት እንገልጻለን። ቀጣይ እርምጃዎችንና በወኪሎች የሚከናወን ሰፊ ሥራን ለመደገፍ ለGit አስተዋጽኦ ማድረጋችንን እንዴት እንደምንቀጥልም እንወያያለን።

አዲስ የምንጭ ኮድ ቁጥጥር ሥርዓት ለምን አስፈለገን

Codex በOpenAI የልማት መጠንንና ፍጥነትን ቀይሯል፤ መሐንዲሶች በአንድ ጊዜ እጅግ የበለጠ ሥራ እንዲያከናውኑ አስችሏል። ይህ ማለት ተጨማሪ ቅርንጫፎችና መላኮች፣ ተጨማሪ ማዋሃዶች፣ እንዲሁም ከልማት አካባቢዎች፣ ከምርምር ሥራዎችና ከCI የሚመጡ ተጨማሪ የማምጣትና የክሎን ክዋኔዎች ማለት ነው።

እነዚህ ፍላጎቶች እርስ በርሳቸው ይደራረባሉ። አሁን አንድ መሐንዲስ በአንድ ጊዜ ለCI ዝግጁ የሆኑ በርካታ ለውጦች አሉት፤ እያንዳንዱ መላክም በርካታ ሥራዎች ተመሳሳይ ኮሚት እንዲያመጡ ሊያደርግ ይችላል።

ባለፈው ዓመት መጨረሻ አካባቢ ጀምሮ፣ የተዋሃደ የኮድ ማከማቻችንን የሚደግፉ ሥርዓቶች ፍላጎቱን ማስተናገድ እየተሳናቸው ነበር። የማምጣትና የመላክ ዝግታ፣ እንዲሁም ያልተሳኩ ማዋሃዶች አጋጥመውን ነበር፤ አስተማማኝነቱም አንዳንድ ጊዜ ከ90% በታች ይወርድ ነበር። የደረስንበት ገደብ የGit ራሱ ነበር፣ ወይስ የተዋሃደ የኮድ ማከማቻችንን አገልግሎት የምንሰጥበት መንገድ? Git የከርነል ማሻሻያዎችን በኢሜይል ይለዋወጥ ከነበረ ማኅበረሰብ ተፈጠረ። ከሁለት አሥርት ዓመታት በላይ፣ አልሚዎች ሶፍትዌር የሚገነቡበት መንገድ ሲቀየር፣ መሣሪያዎቻቸውን በGit ዙሪያ አስማምተዋል። በራሳችን የተዋሃደ የኮድ ማከማቻ ችግሮች መሰማት ሲጀምሩ፣ በዚያ ሥራ ላይ መገንባታችንን መቀጠል ለእኛ አስፈላጊ ነበር።

የተለመደውን የሥራ ፍሰት ጠብቀን፣ ወደ ተለያዩ ቅርንጫፎች የሚደረጉ መላኮችን በትይዩ ለማስተናገድና ለብዙ አንባቢዎች ተመሳሳይ ታሪክን በአንድ ጊዜ ለማቅረብ የጀርባ ሥርዓቱን ዳግም የምንገነባበትን መንገድ አየን። Gitን የምንጭ ኮድ ቁጥጥር የሥራ ፍሰታችን መሠረት ማድረጋችን፣ በደንበኛው ላይ የሚደረጉ ማሻሻያዎች ከOpenAI ውጭም ጠቃሚ እንዲሆኑ ያስችላል። እነዚህን ማሻሻያዎች ከእኛ የGit ቅጂ⁠(በአዲስ መስኮት ውስጥ ይክፈታል) ወደ ዋናው ፕሮጀክት በማበርከት ለሰፊው ማኅበረሰብ ማጋራት ፈልገን ነበር።

Gitን በሰፊ መጠን ለማስኬድ መገንባት

የምንጭ ኮድ ቁጥጥር ሥርዓትን ማስፋት ሁለት መሠረታዊ ገጽታዎች አሉት፦ ወደ ተለያዩ ቅርንጫፎች የሚልኩ ብዙ ጸሐፊዎች፣ እና ተመሳሳይ ታሪክን የሚያመጡ ብዙ አንባቢዎች። Pando ለሁለቱም የተመቻቸ ነው።

በመጀመሪያ፣ Pando የእያንዳንዱን ቅርንጫፍ ዝማኔዎች ለየብቻ ያስተባብራል። ግንኙነት የሌላቸው ቅርንጫፎች ዝማኔዎች በትይዩ ሊቀጥሉ ይችላሉ፤ ቅርንጫፍ የሚያመጣ አንባቢም ለዚያ ስሪት የሚያስፈልገውን ታሪክ ያገኛል። የዚህ መጉደል ግን፣ ብዙ ቅርንጫፎችን የሚመለከት አንባቢ በተለያዩ የጊዜ ነጥቦች ያሉ ሁኔታዎቻቸውን ሊያይ መቻሉ ነው።

ሁለተኛ፣ Pando ለእያንዳንዱ ደንበኛ የተለየ የጥቅል ፋይል ከማመንጨት ይልቅ፣ በተለያዩ የማምጣት ጥያቄዎች ላይ የጥቅል ፋይሎችን (Git ብዙ ኦብጀክቶችን በአንድ ላይ ለመጭመቅ የሚጠቀምበትን ቅርጸት) ደጋግሞ ይጠቀማል። ደንበኛ ቀድሞ ያሉትን አንዳንድ ኦብጀክቶች ሊያወርድ ይችላል፤ ነገር ግን አገልጋዩ በትንሽ ስሌት ተመሳሳይ ባይቶችን ለብዙ ደንበኞች ማቅረብ ይችላል።

እነዚህ ምርጫዎች በቅርንጫፎች ላይ የመጻፍ አቅምን እንድናሳድግና የማንበብ ጥያቄዎችን ከመሸጎጫዎች እንድናስተናግድ ያስችሉናል። እንዴት አብረው እንደሚሠሩ ለማየት፣ Git ታሪክን እንዴት እንደሚያከማችና እንደሚያስተላልፍ በማየት እንጀምር።

የGit ኦብጀክት ማከማቻ መሠረታዊ መግቢያ

Git ሁለት የማከማቻ ክፍሎችን፣ ኦብጀክቶችን እና ማጣቀሻዎችን፣ ተመሳስለው ማቆየት መቻል አለበት።

የGit ማከማቻ የፋይሎችን የየጊዜውን ሁኔታና እነሱን የሚያገናኘውን ታሪክ በኦብጀክቶች ግራፍ መልክ ይመዘግባል። ኦብጀክት ብሎብ፣ ዛፍ፣ ኮሚት ወይም መለያ ሊሆን ይችላል። ብሎቦች የአንድን ፋይል ይዘት ይይዛሉ፤ ዛፎች ደግሞ የማውጫ መዋቅር ለመፍጠር ስሞችን ከብሎቦች ወይም ከሌሎች ዛፎች ጋር ያዛምዳሉ። ኮሚቶች ወደ ሥር ዛፍ እና ወደ ዜሮ ወይም ከዚያ በላይ ወላጅ ኮሚቶች በመጠቆም የማከማቻዎን ታሪክ ይፈጥራሉ።

ኦብጀክቶች ከዓይነታቸውና ከይዘታቸው በሚሰላ ሃሽ ይለያሉ። ኦብጀክቶች አይቀየሩም፦ የተለወጠ ፋይልን መመዝገብ አዲስ ብሎብ ይፈጥራል፤ ያልተለወጡ ፋይሎችና ማውጫዎች ግን ነባር ኦብጀክቶችን እንደገና መጠቀም ይችላሉ።

ቅርንጫፎችና መለያዎች ወደ ኮሚቶች የሚጠቁሙ ማጣቀሻዎች፣ ወይም «refs»፣ ናቸው። በቅርንጫፍ ላይ ኮሚት ማድረግ አዲስ ኮሚት ይፈጥራል፣ የቅርንጫፉንም ማጣቀሻ ወደ እሱ እንዲጠቁም ያዘምናል።

የrefs/heads/main ቅርንጫፍ ወላጁ C1 ወደሆነው ኮሚት C2 ይጠቁማል። C1 ወደ ሥር ዛፍ T1 ይጠቁማል፤ በዚያም parser.py ብሎብ B1ን ያመለክታል። C2 ወደ ሥር ዛፍ T2 ይጠቁማል፤ በዚያም parser.py ብሎብ B2ን ያመለክታል። በሁለቱም ሥር ዛፎች ውስጥ docs/ ተመሳሳይ ዛፍ T3ን ያመለክታል። የዚያ README.md ግቤት ወደ ብሎብ B3፣ usage.md ደግሞ ወደ ብሎብ B4 ይጠቁማሉ።

የGit ኦብጀክቶች እርስ በርሳቸው በመለያቸው ይጣቀሳሉ፤ ኮሚቶች ወደ ዛፎች፣ ዛፎች ደግሞ ወደ ዛፎችና ብሎቦች ይጠቁማሉ። የrefs/heads/main ቅርንጫፍ ወላጁ C1 ወደሆነው ኮሚት C2 ይጠቁማል። C1 ወደ ሥር ዛፍ T1 ይጠቁማል፤ በዚያም parser.py ብሎብ B1ን ያመለክታል። C2 ወደ ሥር ዛፍ T2 ይጠቁማል፤ በዚያም parser.py ብሎብ B2ን ያመለክታል። በሁለቱም ሥር ዛፎች ውስጥ docs/ ተመሳሳይ ዛፍ T3ን ያመለክታል። የዚያ README.md ግቤት ወደ ብሎብ B3፣ usage.md ደግሞ ወደ ብሎብ B4 ይጠቁማሉ።

Git ኦብጀክቶችን «ተነጣጥለው» ወይም «ተጠቅልለው» ባሉ ሁኔታዎች ያከማቻል። ያልተጠቀለሉ ኦብጀክቶች በኦብጀክት መለያቸው በሚለዩ ለየብቻ ፋይሎች ይቀመጣሉ። የተጠቀለሉ ኦብጀክቶች በጥቅል ፋይል ውስጥ አብረው ይቀመጣሉ፤ ይህም ተመሳሳይ ኦብጀክቶች እርስ በርሳቸው ባላቸው ልዩነቶች መልክ እንዲከማቹ ያስችላል።

በ$GIT_DIR/objects ሥር ሁለት የparser.py ስሪቶች ይታያሉ። እንደ ያልተጠቀለሉ ኦብጀክቶች፣ ብሎብ A parse()ን ይይዛል፣ ብሎብ B ደግሞ parse() እና parse_file()ን ሁለቱንም ይይዛል። የጥቅል ፋይሉ Aን ሙሉ በሙሉ ያስቀምጣል፤ Bን ደግሞ ሁሉንም A ቀድቶ parse_file()ን ለመጨመር በሚሰጡ መመሪያዎች ይወክላል። አብሮት ያለው *.idx ፋይል ሁለቱንም ብሎቦች በጥቅል ፋይሉ ውስጥ በኦብጀክት መለያ ያገኛል።

Git ብሎቦችን በተለያዩ ፋይሎች ሊያከማች ወይም አንዱን ብሎብ ከሌላው ባለው ልዩነት መልክ በመወከል በአንድ ላይ ሊጠቀልላቸው ይችላል።

በGit ውስጥ፣ Git ከአንድ ኮሚት ጀምሮ በወላጆቹ፣ በዛፎቹና በብሎቦቹ ያሉ አገናኞችን ተከትሎ ኦብጀክት ማግኘት ከቻለ፣ ያ ኦብጀክት ከዚያ ኮሚት መድረስ የሚቻልበት ነው። በማምጣት ወቅት፣ ደንበኛው የትኞቹን ኮሚቶች እንደሚፈልግና የትኞቹ ቀድሞ እንዳሉት ለአገልጋዩ ይነግረዋል። አገልጋዩ ከሚፈለጉት ኮሚቶች መድረስ የሚቻልባቸውን ኦብጀክቶች ያገኛል፣ ደንበኛው ቀድሞ እንዳሉት የሚያውቃቸውን ያስቀራል፣ የቀሩትንም Git በዲስክ ላይ በሚጠቀምበት ቅርጸት እንደ ጥቅል ፋይል ይልካል። ሙሉ ክሎን ያለምንም ኦብጀክት ስለሚጀምር፣ ክሎን ከሚደረገው ታሪክ መድረስ የሚቻልባቸውን ሁሉንም ኦብጀክቶች ይፈልጋል።

መላክ አገልጋዩ አንድ ወይም ከዚያ በላይ ማጣቀሻዎችን እንዲያዘምን በመጠየቅ ኦብጀክቶችን በተቃራኒው አቅጣጫ ያስተላልፋል። ደንበኛው አገልጋዩ ቀድሞ ያሉትን ኦብጀክቶች ላለመላክ፣ አገልጋዩ ያሳወቃቸውን ማጣቀሻዎች ስብስብ ይጠቀማል። ስለዚህ የሚላከው ጥቅል በነባር ኦብጀክቶች ላይ ሊመረኮዝ ይችላል፤ ጥቅሉን ብቻ መቀበል አዲሱን ታሪክ እንደገና ለመገንባት በቂ አይደለም።

የGit ማከማቻን በቅጂዎች ማሰራጨት ማለት፣ ኦብጀክቶችንም ሆነ ማጣቀሻዎችን በብዙ አገልጋዮች ላይ ተደራሽ አድርጎ ማቆየት ማለት ነው። አንድ ቅጂ አዲሱን የማጣቀሻ እሴት ከማቅረቡ በፊት፣ ከዚያ እሴት መድረስ የሚቻልባቸውን ኦብጀክቶች ማቅረብ መቻል አለበት። አገልግሎቱ ተፎካካሪ የማጣቀሻ ዝማኔዎችን ማስተባበርም አለበት፤ እነዚህም አንድን ቅርንጫፍ ከተመሳሳይ የቀድሞ ጫፍ ወደ ተለያዩ አዲስ ኮሚቶች ለማንቀሳቀስ የሚሞክሩ መላኮች ናቸው። ወደ ማከማቻ የሚደረጉ ሁሉንም ጽሕፈቶች አንድ ቅደም ተከተል እንዲከተሉ የሚያደርጉ ሥርዓቶች፣ ግንኙነት ወደሌላቸው ቅርንጫፎች የሚደረጉ መላኮች እርስ በርሳቸው እንዲጠባበቁ ሊያደርጉ ይችላሉ።

ነባር የተሰራጩ የGit አገልግሎት አቀራረቦች

Pandoን ስንነድፍ፣ Gitን በመጠቀም የምንጭ ኮድ ቁጥጥርን ለማስፋት የተለመዱ አቀራረቦችን ገመገምን። አንዱ የሦስት-ደረጃ ማጽደቅን (3PC፣ ማጽደቅን በብዙ ኖዶች መካከል የሚያስተባብር ፕሮቶኮል) ተጠቅሞ የማጣቀሻ ዝማኔዎችን በማከማቻ ቅጂዎች መካከል ያስተባብራል። ሌላው ደግሞ በብሎብ ማከማቻ ያለ የጋራ ቅድመ-ጽሕፈት መዝገብን (WAL፣ ለውጦች ከመተግበራቸው በፊት የሚጻፍ መዝገብ) ተጠቅሞ ዝማኔዎችን በቅደም ተከተል ያስቀምጣል።

የሦስት-ደረጃ ማጽደቅ (3PC)

በመሰልነው የሦስት-ደረጃ ማጽደቅ ንድፍ፣ የGit አገልግሎቱ በብዙ ቅጂ አገልጋዮች ላይ የማከማቻውን ሙሉ ቅጂ ያስቀምጣል። ማንኛውም አገልጋይ መላክ ሲቀበል፣ የሚገባው የጥቅል ፋይል ተቀድቶ ለሁሉም ቅጂዎች በትይዩ ይላካል። የተላከውን ይፋ ለማድረግ፣ አብዛኛዎቹ ቅጂዎች የማጣቀሻ ዝማኔውን መቀበል አለባቸው። ይህን የሚያስተዳድረው አገልጋይ አስተባባሪው ነው፤ በእሱና በእያንዳንዱ ሌላ ቅጂ መካከል ብዙ ዙር ግንኙነቶች ያስፈልጋሉ።

የማጣቀሻ ዝማኔ ለመቀበል፣ እያንዳንዱ ቅጂ የራሱን የማጣቀሻ ቅጂ ይቆልፋል፣ አሁንም ደንበኛው ወደሚጠብቀው ኮሚት እንደሚጠቁምም ያረጋግጣል። ከዚያ አስተባባሪው ለተቀበሉት ቅጂዎች የቅድመ-ማጽደቅ መልዕክት ይልካል። አብዛኛዎቹ የቅድመ-ማጽደቅ መልዕክቱን መቀበላቸውን ሲያረጋግጡ፣ አስተባባሪው ዝማኔውን እንዲፈጽሙ ይነግራቸዋል። ከዚያ ማንኛውም ወቅታዊ ቅጂ ከአካባቢያዊ የማከማቻ ቅጂው አዲሱን የቅርንጫፍ ጫፍ ማሳወቅ ይችላል።

ሙሉ ቅጂዎችን መያዝ የማንበብ ጥያቄዎችን በአካባቢው ለማስተናገድ ያስችላል፤ ደንበኞች የትኛውንም ቅጂ ቢመርጡ የሁሉንም ማጣቀሻዎች ወጥ ሁኔታ እንዲያገኙም ያረጋግጣል። በዚህ ምክንያት፣ ማጣቀሻዎች አንድ በአንድ ይዘምናሉ፤ እያንዳንዱም መላክ የማጣቀሻ ዝማኔውን በቅጂዎች መካከል ለማስተባበር ብዙ የመልዕክት ዙሮችን ይጠይቃል።

በቂ የቅጂዎች ድምፅ እስኪገኝ መጠበቅ፣ የቅጂዎች የዲስክ አፈጻጸምና የግንኙነት መዘግየት የመላኩን ፍጥነት እንዲወስኑ ያደርጋል። የመጻፍ መጠን እያደገ ሲሄድ፣ ቅጂዎቹ የሚገቡ ጥቅሎችንም ሆነ የማንበብ ጥያቄዎችን በወቅቱ ማስተናገድ አለባቸው።

ቅድመ-ጽሕፈት መዝገብ (WAL)

በመሰልነው በWAL ላይ የተመሠረተ ንድፍ፣ የGit አገልግሎቱ በመላው ማከማቻ ያሉ ዝማኔዎችን በቅደም ተከተል ለማስቀመጥ፣ በብሎብ ማከማቻ ያለ የጋራ መገለጫ ይጠቀማል። አገልጋይ መላክ ሲቀበል፣ የገባውን የጥቅል ፋይል ወደ ብሎብ ማከማቻ ይሰቅላል፣ በአካባቢያዊ የማከማቻ ቅጂውም የማጣቀሻ ዝማኔውን ያዘጋጃል። የተላከውን ይፋ ለማድረግ፣ በብሎብ ማከማቻው ውስጥ ባለው የጋራ መገለጫ ላይ የማጣቀሻ ዝማኔውን የሚመዘግብና ወደ ጥቅል ፋይሉ የሚጠቁም ግቤት ያክላል። ከዚያ የGit አገልጋዩ አወዳድሮ የመተካት ክዋኔ ተጠቅሞ መገለጫውን ያዘምናል። ይህ መገለጫውን በማይነጣጠል ክዋኔ ይተካል፣ ወይም ለውጡን ውድቅ ያደርጋል። በዚህ መካከል ሌላ ጸሐፊ አዘምኖት ከሆነ፣ አገልጋዩ በመካከል የገቡትን ግቤቶች ያነባል፣ የራሱ የማጣቀሻ ዝማኔ አሁንም ትክክል መሆኑን ያረጋግጣል፣ ቀድሞ የሰቀለውን የጥቅል ፋይል ተጠቅሞም እንደገና ይሞክራል።

ጸሐፊዎች የጥቅል ፋይሎቻቸውን በትይዩ መስቀል ይችላሉ፤ ሆኖም ግንኙነት ወደሌላቸው ቅርንጫፎች የሚደረጉ መላኮች እንኳን ተመሳሳይ መገለጫን ማዘመን ይጠይቃሉ። አወዳድሮ የመተካት ክዋኔ በስኬት እስኪጠናቀቅ የሚፈጀው የዙር ጊዜ፣ ማከማቻው አዲስ መገለጫ ምን ያህል በተደጋጋሚ ማውጣት እንደሚችል ይገድባል። አነስተኛ መዘግየት ያለው የብሎብ ማከማቻ ይህን እርምጃ ያፋጥናል። በቡድን ማስኬድ አንድ መገለጫ ብዙ ማጣቀሻዎችን በአንድ ጊዜ እንዲያዘምን ያስችላል፤ ነገር ግን ዝማኔዎችን በተራ በማስጠበቅ መዘግየትን ይጨምራል።

የብሎብ ማከማቻው የጥቅል ፋይሎችን በትይዩ መቀበል ይችላል፤ ነገር ግን የጋራ መገለጫው ዝማኔዎች አሁንም እርስ በርሳቸው ይወዳደራሉ። የብሎብ ማከማቻውን አቅም ብቻ መጨመር ያንን ማነቆ አይፈታውም። እያንዳንዱ ቅጂ ጥቅሎቹን በአካባቢው ከማቅረቡ በፊት፣ አሁንም ከብሎብ ማከማቻ ማንበብና ማውጫ ማዘጋጀት ያስፈልገዋል። የሚገቡ ጽሕፈቶች ከዚያ ሥራ ፍጥነት ከበለጡ፣ ቅጂዎቹ ወደ ኋላ ይቀራሉ፤ ደንበኞችም አዲስ የተላኩ ኮሚቶችን ለማምጣት የበለጠ ጊዜ ይጠብቃሉ።

የPandoን አርክቴክቸር መንደፍ

ይህም ወደ Pando ያመጣናል። Pando ብዙ ደንበኞች በአንድ ጊዜ መላክ እንዲችሉ አቅምን የማስፋት ግብ ያለው፣ የGit ማከማቻዎችን አገልግሎት የሚያቀርብ አዲስ አርክቴክቸር ነው። እንዲህ ይሠራል፦

ገደቦችን እንደገና ማጤን

Pandoን ከማዘጋጀታችን በፊት፣ Gitን ሳንቀይር ፍላጎቶቻችንን ማሟላት እንደምንችል ግምት ነበረን። ሆኖም አብዛኞቹ የGit ሥርዓቶች አስፈላጊ እንደሆኑ ከሚቆጥሯቸው አንዳንድ ነገሮች መተው ነበረብን፦

  • ማከማቻውን በሙሉ የሚያጠቃልል ወጥነት፦ ሁሉንም ማጣቀሻዎች በአንድ የጊዜ ነጥብ ያሉበትን ሁኔታ በወጥነት ለማቅረብ፣ በመላው ማከማቻ ቅንጅት ያስፈልጋል። ሁሉንም የማጣቀሻ ዝማኔዎች በአንድ ቅደም ተከተል በሚያስቀምጥ ሥርዓት ውስጥ፣ ግንኙነት ወደሌላቸው ቅርንጫፎች የሚደረጉ መላኮች በአንድ የቅንጅት ነጥብ ላይ ይወዳደራሉ።

  • ለእያንዳንዱ ደንበኛ የተለየ የጥቅል ፋይል፦ የተለያየ አካባቢያዊ ታሪክ ያላቸው ሁለት ደንበኞች ተመሳሳይ ቅርንጫፍ ሲያመጡ፣ አገልጋዩ ቀድሞ ያሏቸውን ኦብጀክቶች ላለመላክ ለእያንዳንዳቸው የተለየ ጥቅል ማመንጨት ሊያስፈልገው ይችላል። እነዚህን ምላሾች መፍጠር የCPU እና የዲስክ ግብዓት/ውጤት ሀብት ስለሚፈጅ፣ ብዙ አንባቢዎችን ለማገልገል አቅምን ማሳደግ አስቸጋሪ ይሆናል።

በምትኩ፣ Pando የመጻፍ አቅምን ለማሳደግ ያልጠበቀ የወጥነት ስልት (ምክንያታዊ ወጥነት) ይሰጣል፤ የማንበብ አቅምን ለማሳደግ ደግሞ የጥቅል ፋይሎችን ደጋግሞ ይጠቀማል።

ምክንያታዊ ወጥነት (CC)

ደንበኛ ወደ ቅርንጫፍ ሲልክ፣ Pando የሚገባውን የጥቅል ፋይል ሊቀየር በማይችል ብሎብ መልክ በብሎብ ማከማቻ ያስቀምጣል። ቅርንጫፉ በተለወጠ ቁጥር፣ Pando አዲሱን ጫፍ፣ ያቀረበውን ጥቅል እና ጥቅሉ የሚመረኮዝባቸውን ቀደምት የማጣቀሻ ስሪቶች የያዘ የማጣቀሻ ስሪት በሜታዳታ ማከማቻ ይመዘግባል። የብሎብ ማከማቻውም ሆነ የሜታዳታ ማከማቻው ተጨማሪ ማሽኖችን በመጨመር ሊሰፉ ይችላሉ።

ኮሚትን ወይም ማጣቀሻን ከPando ለማምጣት፣ የሚመጣውን የማጣቀሻ ስሪት የፈጠረውን ደንበኛ ሁኔታ እንደገና ለመገንባት፣ የማጣቀሻ ስሪቶችን (የጥቅል ፋይሎችን) ስብስብ ለደንበኛው በቅደም ተከተል ማቅረብ ያስፈልጋል። ይህ በመላው ማከማቻ ደረጃ ያልጠበቀ ወጥነትን ሲሰጥ፣ ለእያንዳንዱ ማጣቀሻ ዝማኔዎች ግን በተራ እንደተፈጸሙ የሚቆጠር ውጤት ያረጋግጣል። ደንበኞች የሚጋጩት ወደ አንድ ማጣቀሻ በተመሳሳይ ጊዜ ሲልኩ ብቻ ነው። ብዙ ቅርንጫፎችን የሚያነብ ደንበኛ፣ እነዚያ ንባቦች በመላው ማከማቻ ላይ አንድ የጊዜ ነጥብን ይወክላሉ ብሎ መገመት አይችልም።

በግራ፣ ሦስት ተከታታይ የዋና ቅርንጫፍ ጥቅሎች በቅደም ተከተል A፣ B እና C፤ D እና E፤ እና F ኮሚቶችን ይይዛሉ። በቀኝ፣ ዋናውና የጎን ቅርንጫፉ ከC ላይ ይለያያሉ። ዋናው ቅርንጫፍ ወደ G ሲያድግ፣ የጎን ቅርንጫፉ በD፣ E እና F ይቀጥላል። የጎን ቅርንጫፉ የቅርብ ጊዜ ጥቅል D፣ E እና Fን ይይዛል። የተቆራረጠ የወሰን መስመር D እና E በቀደመው የጎን ቅርንጫፍ ጥቅልም እንዳሉ ያሳያል። ሰማያዊው ቀስት አዲሱ ጥቅል በG ላይ ባለው ዋና ቅርንጫፍ መመርኮዙን ያሳያል። የF የGit ወላጅ E ነው።

ወደ ዋናው ቅርንጫፍ መላክ አንድ ወይም ከዚያ በላይ ኮሚቶችን የያዘ ተጨማሪ ጥቅል ያክላል። ወደ ጎን ቅርንጫፍ በሚደረግ እያንዳንዱ መላክ የዚያ ቅርንጫፍ ቀደምት ኮሚቶች እንደገና ይካተታሉ፤ ስለዚህ የተገለጸው የዋና ቅርንጫፍ ስሪት ያለው ደንበኛ የጎን ቅርንጫፉን በአንድ ጥቅል ማምጣት ይችላል።

ይህ የምክንያታዊ ወጥነት አንድ ዓይነት ነው። ማጣቀሻን ለማምጣት፣ አንባቢው ያንን ማጣቀሻ የፈጠረውን ጸሐፊ ታሪክ ይመለከታል። በመላክ ወቅት፣ Pando ደንበኛውና አገልጋዩ በየትኛው የጋራ ታሪክ ላይ እንደሚስማሙ ይቆጣጠራል። ይህም ደንበኞች በቀላሉ ሊጋሩ የሚችሉ የጥቅል ፋይሎችን እንዲፈጥሩ ያረጋግጣል።

በዚህ ምክንያት፣ Pando በGit ክዋኔዎች ወቅት ሁሉም ማጣቀሻዎች በአንድ ጊዜ ያሉበትን ሁኔታ ወይም በክሎን ማድረግና በማምጣት ውስጥ የማጣቀሻ ዝማኔዎችን ቅደም ተከተል አያቀርብም። ለምሳሌ፣ ለሙሉ ክሎን ድርድር በሚደረግበት ጊዜ foo እና bar ቅርንጫፎች ሁለቱም ተዘምነዋል እንበል። በድርድሩ ወቅት፣ አንድ ደንበኛ foo በስሪት 1 እና barን በስሪት 2 ሊያይ ይችላል፤ ሌላው ግን fooን በስሪት 2 እና barን በስሪት 1 ሊያይ ይችላል። በተግባር፣ ተጠቃሚዎችና ወኪሎች በማጣቀሻ ዝማኔዎች አጠቃላይ ቅደም ተከተል ላይ አይመረኮዙም፤ ይልቁንም በአንድ ማጣቀሻ ዝማኔዎች ቅደም ተከተል ላይ ይመረኮዛሉ።

አቀራረቦችን ማነጻጸር

የሦስቱን የወጥነት ስልቶች በሚያነጻጽረው በዚህ ማስመሰያ፣ 1,000 ደንበኞች እያንዳንዳቸው የተለየ ቅርንጫፍ እንዲመርጡና ከዚያም ልዩ ኮሚቶችን ደጋግመው እንዲልኩ እናዋቅራለን። ጠቅላላ የፈጀውን ጊዜና ከመላክ እስከ ማምጣት ያለውን መዘግየት እንለካለን። ሁለተኛው መለኪያ ለሥራ ጫናዎች አስፈላጊ ነው፤ ተጠቃሚዎችና ወኪሎች ለመተባበር ወይም በስሪት ቁጥጥር ላይ የሚመረኮዙ ሌሎች ሥርዓቶችን ለመጠቀም የሚፈጅባቸውን የዙር ጊዜ ይለካልና። ማስመሰያው ከመደበኛ እስከ ከፍተኛ አፈጻጸም ያላቸውን ምናባዊ ማሽኖችና የብሎብ ማከማቻ ሥርዓቶች ሃርድዌር ይወክላል። በዚህ ማስመሰያ፣ ለሦስት-ደረጃ ማጽደቅ በመላው ማከማቻ ላይ የሚጠየቀውን ወጥነት አላልተናል።

Simulating Git Server Implementations

Follow each writer through repeated pushes, and separately measure when an independent reader can check out each commit.

Three-phase commit

Ready
Simulated time
0 s
Mean push to fetch
—
Writers done
0 / 1,000

Each square represents one writer. All selected architectures run the same workload. Squares lighten as pushes are acknowledged and turn blue when a writer finishes. The chart shows writers finished over simulated time; independent readers can continue fetching afterward. Use arrow keys to select a writer, Home or End to jump, and Escape to clear.

0 / 10,000 pushes acknowledged · 0 fetched

Select a square to inspect that writer.

Object-store WAL

Ready
Simulated time
0 s
Mean push to fetch
—
Writers done
0 / 1,000

Each square represents one writer. All selected architectures run the same workload. Squares lighten as pushes are acknowledged and turn blue when a writer finishes. The chart shows writers finished over simulated time; independent readers can continue fetching afterward. Use arrow keys to select a writer, Home or End to jump, and Escape to clear.

0 / 10,000 pushes acknowledged · 0 fetched

Select a square to inspect that writer.

Pando

Ready
Simulated time
0 s
Mean push to fetch
—
Writers done
0 / 1,000

Each square represents one writer. All selected architectures run the same workload. Squares lighten as pushes are acknowledged and turn blue when a writer finishes. The chart shows writers finished over simulated time; independent readers can continue fetching afterward. Use arrow keys to select a writer, Home or End to jump, and Escape to clear.

0 / 10,000 pushes acknowledged · 0 fetched

Select a square to inspect that writer.

Writer progress through verified fetches

  • Three-phase commit
  • Object-store WAL
  • Pando
05001,00000 s
  • Waiting
  • Pushing
  • All pushes acknowledged
0 sLater

Synthetic teaching models, not production benchmarks. Mean push to fetch covers topic pushes, from the first attempt through retries until an independent reader verifies that commit. It includes waiting for a reader slot and excludes builds and tests. With merges enabled, writer completion includes the required fetches and trunk merge.

Experiment settings

Preparing simulation…

Results

Play the comparison to see the recorded results.

Synthetic teaching models, not production benchmarks. Mean push to fetch covers topic pushes, from the first attempt through retries until an independent reader verifies that commit. It includes waiting for a reader slot and excludes builds and tests. With merges enabled, writer completion includes the required fetches and trunk merge.

Pandoን ከሌሎች ሁለት አቀራረቦች ጋር የሚያነጻጽረውን ይህን ማስመሰያ ያስኪዱ። ልዩነታቸውን ለማየት፣ ከመደበኛ እስከ ከፍተኛ አፈጻጸም ያለው ሃርድዌር ድረስ መሠረተ ልማቱን፣ የደንበኞችን ብዛትና ሌሎች ቅንብሮችን ይምረጡ።

የተመሰለው የሦስት-ደረጃ ማጽደቅ ሥርዓት፣ በጫና ሥር ዲስኮቹ የአቅማቸውን ጣሪያ ሲደርሱ በእጅጉ የላቀ የመጻፍ መዘግየት ያሳያል። ከለውጥ በፊት የሚመዘግቡ ሥርዓቶች ደግሞ በተመሳሳይ ምክንያት፣ አገልጋዮቻቸው ከመዝገቡ ማንበብን ማስተናገድ ስለሚያቅታቸው፣ በእጅጉ የላቀ የማንበብ መዘግየት ያሳያሉ። በአንድ የተዋሃደ የኮድ ማከማቻችን ላይ ባደረግነው ተጨባጭ ሙከራም ሆነ በዚህ ማስመሰያ፣ Pando በጫና ሥር አፈጻጸሙ ሳይቀንስ በብዙ ሺህ የሚቆጠሩ ደንበኞች በአንድ ጊዜ እንዲልኩ ይደግፋል።

Pando መላክን ሲያስተናግድ፣ የሚገባውን የጥቅል ፋይል ወደ ብሎብ ማከማቻ እያስተላለፈ ያረጋግጣል፤ ወደ አካባቢያዊ ማከማቻ አይፈታውም። ደንበኛ ማምጣት ሲጀምር፣ Pando አንባቢው የሚፈልጋቸውን የተከማቹ ጥቅሎች ይመርጣል፣ አንባቢውም ያወርዳቸዋል። ማንኛውም አገልጋይ የጥቅል ፋይሎችን በአካባቢያዊ ማከማቻ ላይ መተግበር ወይም ብዙ ሀብት የሚፈጁ የመፍታትና የማሸግ ክዋኔዎችን ማከናወን አያስፈልገውም። እነዚህ አገልጋዮች በዋነኝነት ድርድርና የጥቅል ፋይል ምርጫን ስለሚያከናውኑ፣ የPando አገልጋዮች በመደበኛ ሃርድዌር ሊሠሩ ይችላሉ።

ይህ Pando እስከ ደንበኞቹ፣ በደንበኞችና በPando መካከል እስካለው አውታረ መረብ እና እስከ ብሎብ ማከማቻ አገልግሎቱ አቅም ገደብ ድረስ እንዲሰፋ ያስችለዋል። በቂ አቅም ካለ፣ በተለያዩ ገለልተኛ ቅርንጫፎች ላይ የሚሠሩ ደንበኞች እያንዳንዳቸው ግንኙነታቸው በሚፈቅደው ፍጥነት ጥቅሎችን ማስተላለፍ ይችላሉ። በዚያ ፍጥነት ተጨማሪ ደንበኞችን ለማገልገል፣ የPando አገልጋዮችን መጨመርና የሜታዳታ እና የብሎብ ማከማቻዎችን አብረን ማስፋት እንችላለን።

Pushing and Fetching a Branch in Pando

Pando stores the writer’s packfile in blob storage and records the ref version in metadata service. On fetch, Pando selects the packs the reader needs, and Express serves them.

Stream the push

  • Packfile bytes
  • Metadata
  • Request / acknowledgment
  • Packfile URIs

አንድ ወኪል ፋይሎችን ያርትዓል፣ በአካባቢው ኮሚት ይፈጥራል፣ ከዚያም git pushን ያስኬዳል። ይህም ቅርንጫፍን ለማዘመን የለውጦቹን የጥቅል ፋይል ይፈጥራል። Pando ጥቅሉን ተቀብሎ ወደ ብሎብ ማከማቻ በፍሰት ያስተላልፈዋል። የገባውን መላክ በአንድ ዙር ዲኮድ አድርጎ ካረጋገጠ በኋላ፣ Pando ብዙ ቁልፎችን የሚነካ ግብይት በመጠቀም በሜታዳታ ማከማቻችን የማጣቀሻ ስሪት ይመዘግባል፣ የማጣቀሻ ጠቋሚውንም በማይነጣጠል ክዋኔ ያዘምናል። ይህ Pando «የጻፍከውን ራስህ ማንበብ» የሚያስችል ወጥነት እንዲሰጥ ያደርገዋል። ይህ አጠቃላይ የመጻፍ ክዋኔ O(1)O(1) የሜታዳታ ንባቦችና ጽሕፈቶች ይፈልጋል።

ሌላ ደንበኛ ቅርንጫፉን ሲያመጣ፣ Pando ደንበኛው ቀድሞ ያለውን ታሪክ ተጠቅሞ የተከማቹ ጥቅሎችን ስብስብ ይመርጣል። ይህ ክዋኔ O(log⁡Δ)O(\log \Delta) የሜታዳታ ንባቦች ይፈልጋል፤ Δ\Delta ደግሞ ደንበኛው ባለውና በሚፈልገው መካከል በማጣቀሻ ስሪቶች የሚለካው አጭሩ ርቀት ነው። አገልጋዩ የጥቅል ፋይል URIዎችን ይመልሳል፤ ደንበኛውም የጥቅል ፋይሎችን በክልላዊ መሸጎጫዎች በሚያስቀምጠው Express አገልግሎት በኩል ያወርዳቸዋል።

ይህ ንድፍ በPando አርክቴክቸር ሦስት ዋና አገልግሎቶች ላይ ይመረኮዛል፦ መላክ፣ ማምጣት እና ኮምፓክሽን።

የመላክ አቅምን ማስፋት

ደንበኛ ሲልክ፣ መደበኛ የGit አገልጋይ ሁሉንም ካርዶቹን እንደሚያሳይ የፖከር ተጫዋች፣ ያሉትን ቅርንጫፎች በሙሉ ለደንበኛው ይገልጣል። ከዚያ ደንበኛው ኮሚቶችን፣ ዛፎችንና ብሎቦችን ሰብስቦ፣ አገልጋዩ ቀድሞ እንዳሉት የሚያውቃቸውን ኦብጀክቶች የማያካትት የጥቅል ፋይል ይፈጥራል።

ተጨማሪ ማጣቀሻዎችን መግለጽ የሚላከውን መጠን ሊያሳንስ ይችላል። ሌላ ደንበኛ ጸሐፊው ያስቀራቸው ኦብጀክቶች ላይኖሩት ስለሚችሉ፣ ጥቅሉን እንደገና መጠቀምም ሊያስቸግር ይችላል።

Pando የተለየ አቀራረብ ይከተላል። ያለውን ሁሉ ከመግለጽ ይልቅ፣ የተመረጡ ቅርንጫፎችን ብቻ ለደንበኛው ያሳውቃል። ይህ የሚደረገው በሁለት ምክንያቶች ነው፦

  1. የእያንዳንዱን ማጣቀሻ ሁኔታ በወጥነት ማቅረብ ብዙ ሀብት ይፈጃል። በሚሊዮኖች የሚቆጠሩ ቅርንጫፎች ሲኖሩ፣ የማጣቀሻ ማሳወቂያው ብቻ ከ100 MiB ሊበልጥ ይችላል። ይህን ለማቅረብ እያንዳንዱ አገልጋይ ብዙ የቅንጅት ወጪ የሚጠይቅ ወቅታዊ ማዛመጃ መያዝ፣ ወይም ከማጣቀሻዎች ብዛት ጋር የሚያድግ የውሂብ ጎታ ጥያቄ ማስኬድ አለበት።

  2. ከማጣቀሻዎቹ ውስጥ የተወሰኑትን ብቻ ለደንበኛው በማቅረብ፣ ደንበኛው አገልጋዩ በግልጽ እንዲያስቀር በፈቀደለት ብቻ የሚመረኮዝ ጥቅል ያመነጫል። ጥገኝነቶችን መከታተል፣ Pando ደንበኛ በአንድ መላክ ያመነጨውን የጥቅል ፋይል ለቀጣይ የማምጣት ጥያቄ ምላሽ እንደገና እንዲጠቀምበት ያስችለዋል።

የGit አገልጋይ ብዙ ማጣቀሻዎችን ባሳወቀ ቁጥር፣ የሚልኩ ደንበኞች ኦብጀክቶችን ለማስቀረት ብዙ መነሻዎች ይኖሯቸዋል፤ ይህም አነስ ያሉ ጥቅሎችን እንዲፈጥሩ ያስችላቸዋል። ሆኖም እነዚህን የጥቅል ፋይሎች እንደገና ለመጠቀም፣ አገልጋዩ የሚያመጡት ደንበኞች ጥቅሎቹ የሚመረኮዙባቸውን ክፍሎች ሁሉ እንዳሏቸው ማረጋገጥ መቻል አለበት። ያለዚያ፣ የጥቅል ፋይሉ ደንበኛው የሚፈልጋቸውን ኦብጀክቶች ሊያስቀር ይችላል።

በሌላ በኩል፣ የGit አገልጋይ ምንም ማጣቀሻ ካላሳወቀ፣ ደንበኛው ሙሉ የማከማቻውን ታሪክ የያዘ የጥቅል ፋይል ያመነጫል። ያንን የጥቅል ፋይል ሌላ ማንኛውም ደንበኛ ሊጠቀምበት ይችላል፤ ነገር ግን ማንኛውንም ቅርንጫፍ ማምጣትን በተግባር ሙሉ ክሎን ከማድረግ ጋር እኩል በማድረግ ከፍተኛ ወጪ ያስከትላል።

የተገለጹ ማጣቀሻዎች የጥቅል ፋይል መጠንን እንዴት እንደሚነኩ የሚያሳይ ኩርባ፦ ምንም ሳይገለጽ ሙሉ ታሪክን ከማካተት፣ ዋናውን ቅርንጫፍ ብቻ በመግለጽ በኩል፣ ሁሉም ማጣቀሻዎች ሲገለጹ አዲስ ኦብጀክቶችን ብቻ እስከማካተት።

ተጨማሪ ማጣቀሻዎችን ማሳወቅ አነስ ያሉ የጥቅል ፋይሎች እንዲፈጠሩ ያደርጋል። አብዛኛው የመጠን ቅናሽ አንድ ማጣቀሻ ብቻ በማሳወቅ ሊገኝ ይችላል።

በነባሪ፣ ደንበኛ አዲስ የባህሪ ቅርንጫፍ ሲልክ፣ Pando እንደ መሠረት የተመደበውን ዋና ቅርንጫፍ ብቻ ያሳውቃል። ይህ በማከማቻው ውስጥ ቅርንጫፎች ሲጨመሩ የማሳወቂያው መጠን እንዳይለወጥ ያደርጋል፤ ሆኖም የሚከፈል ዋጋ አለው። መሐንዲስ ወደ አንድ ቅርንጫፍ ብዙ ጊዜ ሲልክ፣ ወይም በአንድ የባህሪ ቅርንጫፍ ላይ ሌላ ሲገነባ፣ ደንበኛው ከዋናው ቅርንጫፍ ውጭ ያለውን ሁሉ እንደገና መላክ አለበት።

ይህ ተከታታይ የቅርንጫፍ መላኮች በመጠን እንዲጨምሩ፣ ሊደጋገሙ የሚችሉ ኦብጀክቶችን እንዲይዙና ተጨማሪ የደንበኛ ባንድዊድዝ እንዲጠቀሙ ያደርጋል። በተዋሃደ የኮድ ማከማቻችን፣ በዚህ መንገድ የተፈጠረ የጥቅል ፋይል መካከለኛ መጠን ከ20 KiB በታች፣ 99ኛው ፐርሰንታይል ደግሞ ከ3 MiB በታች ነበር። ለእኛ ይህ ምክንያታዊ ምርጫ ነበር፤ የተገለጸው የዋና ቅርንጫፍ ታሪክ ቀድሞ ያለው አንባቢ ቅርንጫፉን በዚያ አንድ የጥቅል ፋይል ማምጣት ይችላልና።

ለደንበኛው የሚያሳውቃቸውን ማጣቀሻዎች ከመረጠ በኋላ፣ Pando መላኩን ተቀብሎ የሜታዳታ ማከማቻውን ያዘምናል። Pando የሜታዳታ ዝማኔውን ወደ ተመሳስለውና ሳይመሳሰሉ የሚከናወኑ ክፍሎች ይከፍለዋል። ተመሳስሎ የሚከናወነው የሜታዳታ ዝማኔ፣ ደንበኞች አዲስ የተዘመነውን ኮሚት ወዲያውኑ ማምጣት እንዲችሉ ያረጋግጣል። ይህ አዲስ የማጣቀሻ ስሪት ይጽፋል፣ ጠቋሚውንም ከዚያ አዲስ ስሪት ጋር ያዛምዳል። አዲሱን ጫፍ፣ በጥቅል ፋይሉ ድርድር የተጠቀሙባቸውን ጥገኝነቶችና ወደ ተላከው የጥቅል ፋይል የሚወስድ አገናኝ ያስቀምጣል።

በተመሳሳይ ጊዜ፣ እንደ ኮምፓክሽን መርሐ ግብር ማስያዝ ያለ ሳይመሳሰል የሚከናወን ሥራ በዚያው ግብይት ይመዘገባል። በጣም ትልቅ ለሆኑ መላኮች፣ ከኮሚቶቹ ውስጥ የተወሰኑት ብቻ ተመሳስለው ይጻፋሉ። ይህ፣ የመላኩ መጠን ምንም ይሁን ምን፣ የሜታዳታ ማከማቻውን ማንበብና በእሱ ላይ መጻፍ ቋሚ ብዛት ያላቸው ክዋኔዎችን ብቻ እንዲጠይቅ ያስችለናል።

ከሁሉም በላይ፣ የPando አገልጋዮች ግንኙነት ወደሌላቸው ማጣቀሻዎች የሚደረጉ መላኮችን ለየብቻ መቀበል ይችላሉ። የሚወዳደሩበት ብቸኛው ቁልፍ የማጣቀሻ ጠቋሚው ነው፤ እሱንም አወዳድሮ መተካትን በሚመስል የማይነጣጠል ክዋኔ እንጠብቀዋለን። የPando አገልጋዮችን፣ የሜታዳታ ማከማቻ ማስፋፊያ ክፍሎችን ወይም የብሎብ ማከማቻዎችን በመጨመር የመጻፍ የማስተላለፊያ ዘዴን ማሳደግ እንችላለን።

ሙሉ የአውታረ መረብ ፍጥነትን የሚጠቀም የማምጣትና የክሎን አፈጻጸም

ደንበኛ ማምጣት ሲያከናውን፣ በፕሮቶኮሉ ውስጥ haveዎች እና wantዎች ተብለው የሚታወቁ ሁለት የኮሚት መለያ ስብስቦችን ለአገልጋዩ ይሰጣል። በመደበኛ የGit አገልጋይ ውስጥ፣ አገልጋዩ ካሉት ኮሚቶች መድረስ በሚቻልባቸው ኦብጀክቶችና ከሚፈለጉት ኮሚቶች መድረስ በሚቻልባቸው መካከል ያለውን የስብስብ ልዩነት ያሰላል፣ ይጨምቃቸዋል፣ ውጤቱንም ለደንበኛው ይልካል። የክፍት ምንጭ የGit አገልጋይ ይህን ክዋኔ ለማፋጠን የተለያዩ አካባቢያዊ ማውጫዎች ቢኖሩትም፣ እነዚህን የጥቅል ፋይሎች ማስላት ብዙ ሀብት ሊፈጅ ይችላል፤ በአጠቃላይም ለመሸጎጥ አመቺ አይደሉም።

በምትኩ፣ Pando በመላክ ወቅት የተመዘገቡ የኮሚት ማዛመጃዎችን ተጠቅሞ የደንበኛውን haveዎች እና wantዎች ይፈልጋል፣ እነዚያን ኮሚቶች ከያዙ የማጣቀሻ ስሪቶች ስብስብ ጋርም ያዛምዳቸዋል። እያንዳንዱ ከእነዚያ የማጣቀሻ ስሪቶች Pando ቀደም ብሎ ከተቀበለው የጥቅል ፋይል ጋር ይገናኛል። አገልጋዩ ይህን ተጠቅሞ ደንበኛው የሚፈልገውን ይወስናል፤ የሚፈልጋቸውን ኦብጀክቶች ስብስብ የሚሸፍኑ የጥቅል ፋይሎችንም ይመርጣል።

Planning fetches in Pando

Pando compares what a client has with what it wants, then selects the stored packfiles needed—including any missing branch dependencies.

Already heldFetchMissing branch dependency

Fetch 27 trunk packs.

Select a branch to include its trunk dependencies.

Pando የGit ፕሮቶኮል ያሉና የሚፈለጉ ኮሚቶችን ከማጣቀሻ ስሪቶች ቅደም ተከተል ጋር ያዛምዳል። የጎን ቅርንጫፍን መፈለግ፣ በዋናው ቅርንጫፍ ላይ እስከሚመረኮዝባቸው ክፍሎች ድረስ መፈለግንም ያካትታል።

የGit ፕሮቶኮል በክሎን ወይም በማምጣት የHTTP ምላሽ ውስጥ አንድ የጥቅል ፋይል ብቻ እንዲላክ ይፈቅዳል። ሆኖም፣ ብዙም ትኩረት ያልተሰጠው የGit ፕሮቶኮል ባህሪ፣ packfile-uri፣ አገልጋይ ተጨማሪ ጥቅሎችን ለየብቻ ለማውረድ የሚያስችሉ አገናኞችን እንዲመልስ ይፈቅዳል። Pando ይህን ብቻ ይጠቀማል፤ በምላሹ ውስጥም ባዶ የጥቅል ፋይል ይልካል። ይህን ባህሪ ለመደገፍ፣ OpenAI በ packfile-uri ላይ በርካታ ማሻሻያዎችን ለዋናው ፕሮጀክት አበርክቷል።

የOpenAI ሥርዓቶች በብዙ ጂኦግራፊያዊ ክልሎች ይሠራሉ፤ ስለዚህ በእያንዳንዱ ክልል አካባቢያዊ መሸጎጫዎች ያሏቸውን የPando ክላስተሮች እናስተዳድራለን። የጥቅል ማድረሻ አገልግሎቱ Express የብሎብ ማከማቻችንን ውሂብ ይሸጉጣል፤ ሌላ የተለየ አገልግሎት ደግሞ የሜታዳታ ማከማቻውን ይሸጉጣል። እነዚህ መሸጎጫዎች Pando የኮሚት መለያ ጥያቄዎችን ወይም ልዩ የማጣቀሻ ንባብን፣ በዚያ ክላስተር ውስጥ ከተሸጎጠው ሁኔታ ብቻ እንዲያስተናግድ ያስችሉታል። የጥቅል ፋይል ጥያቄዎችን ወደ Express አገልጋዮች ለመምራት ወጥ ሃሺንግ እንጠቀማለን፤ ከ99% በላይ የሚሆኑትም ከመሸጎጫ ይገኛሉ።

ይህ የመሸጎጫ ሥርዓት እጅግ ከፍተኛ የማስተላለፊያ ዘዴ ይሰጣል፤ በደንበኞችና በPando መካከል ያለውን የአውታረ መረብ አቅም ሙሉ በሙሉ መጠቀም ይችላል። እነዚህን የጥቅል ፋይል URIዎችና አካባቢያዊ መሸጎጫዎች በመጠቀም፣ መደበኛ የደመና አቅራቢ ምናባዊ ማሽኖችን ብቻ እየተጠቀምን የክሎንና የማምጣት ክዋኔዎች የ10 Gbps የአውታረ መረብ ግንኙነቶችን ሙሉ አቅም እንደሚጠቀሙ አረጋግጠናል።

ኮምፓክሽን እና የመጀመሪያውን ባይት እስከማግኘት ያለው ጊዜ

ለአብዛኞቹ የGit አገልጋዮች፣ እያደገ ያለ ማከማቻን አፈጻጸም ለመጠበቅ እንደገና ማሸግና የማያስፈልጉ ኦብጀክቶችን ማጽዳት ያስፈልጋሉ። ሁለቱም እርምጃዎች የማከማቻ ቦታ ነጻ ያደርጋሉ፤ ነገር ግን ብዙ ስሌትና ግብዓት/ውጤት ይጠይቃሉ።

እንደ OpenAI የተዋሃደ የኮድ ማከማቻ በፍጥነት በሚለዋወጥ ማከማቻ፣ ከመጨረሻው ማምጣት በኋላ ለተከናወነ እያንዳንዱ መላክ የተለየ የጥቅል ፋይል URI መላክ ተግባራዊ አይደለም። ደንበኛ ዋና ቅርንጫፉን ወቅታዊ ለማድረግ በየቀኑ በአሥር ሺህዎች የሚቆጠሩ የጥቅል ፋይሎችን ማውረድ ያስፈልገዋል።

በምትኩ፣ Pando ይህን ተጨማሪ ወጪ ለመቀነስ ጥቅሎችን ከጀርባ ያዋህዳል፤ ይህም በሎግ መዋቅር ያላቸው የውህደት ዛፎች ውስጥ ካለው ኮምፓክሽን ጋር የሚመሳሰል ንድፍ ነው። እያንዳንዱ መላክ Pando «L0» ብሎ የሚጠራውን የጥቅል ፋይል ይፈጥራል፤ ይህም Pando ሊያስተላልፈው የሚችለውን ትንሹን የውሂብ አሃድ ይወክላል። ከጊዜ በኋላ፣ የጀርባ ሠራተኞች እነዚህን የጥቅል ፋይሎች ተከታታይ የማጣቀሻ ስሪቶችን በሚሸፍኑ ስብስቦች ያሰባስባሉ፤ እነዚህም ከL0 ጀምሮ በቋሚ የማባዣ መጠን ያድጋሉ። ዛሬ የተዋሃደ የኮድ ማከማቻችን እስከ L4 የሚደርሱ የጥቅል ፋይል ሽፋን ስብስቦችን ይጠቀማል።

እነዚህ ሽፋን ስብስቦች ሁለት ዓላማዎችን ያገለግላሉ። አንድ ሽፋን ስብስብ በቂ ከሞላ በኋላ፣ የኮምፓክሽን ሠራተኛ ተረክቦት አንድ የጥቅል ፋይል ያመነጫል። ይህ በጥቅል ፋይሉ ውስጥ ያሉትን ኦብጀክቶች እንደገና በማደራጀት የመጭመቅ ጥምርታን ያሻሽላል። በተጨማሪም፣ በማጣቀሻ ስሪቶች ላይ እንደ ዝላይ ዝርዝር በመሥራት የማምጣት ድርድርን አፈጻጸም ያሻሽላል። በእያንዳንዱ ደረጃ ያሉ ማውጫዎችን በአንድ ጊዜ በመቃኘት፣ Pando ለደንበኛ የሚላኩ ጥቅሎችን በሎጋሪዝማዊ ጊዜ መምረጥ ይችላል። እነዚህ የጥቅል ፋይል ሽፋን ስብስቦች፣ እንደገና ተጠቅልለውም ሆነ ሳይጠቀለሉ፣ የማምጣት እቅድን ይበልጥ ቀልጣፋ ያደርጋሉ፤ በPando ላይ የሚጣሉትን የማስተላለፊያ ዘዴና የመዘግየት መስፈርቶችም ያቀላሉ።

Compaction in Pando

Small packfiles are grouped into larger covers across levels, improving compression and speeding up fetches.

Compaction in progressPublished cover

ኮምፓክሽን ከብዙ የማጣቀሻ ስሪቶች የመጡ የጥቅል ፋይሎችን ከጀርባ ያዋህዳል፤ ይህም በጥቂት ፋይሎች ይበልጥ ቀልጣፋ ማምጣትን ያስችላል።

ከብዙ የGit አገልጋዮች በተለየ፣ የጥቅል ፋይሎች በሁሉም ደረጃዎች ይቀመጣሉ፤ አይጣሉም ወይም እንደ ቆሻሻ አይጸዱም። ደንበኞች በማምጣት ጥያቄ ውስጥ በሚያቀርቧቸው haveዎች እና wantዎች መሠረት፣ በሁሉም ደረጃዎች ያሉ ጥቅሎች ደንበኞችን ያለማቋረጥ ለማገልገል ይጠቅማሉ። Pandoን እንደ API ለሚጠቀሙ ደንበኞች ደግሞ፣ ከጥቅል ፋይል ማንኛውንም ኦብጀክት ማንበብ ከL4 ይልቅ ከL0 አነስተኛ ውሂብ ማንበብን ይጠይቃል፤ በL0 ውስጥ የመጨመቅ እድሉ አነስተኛ ነውና።

በPando ውስጥ ኮምፓክሽን ለደንበኞች የሚላከውን ጠቅላላ የውሂብ መጠን በእጅጉ ይቀንሳል፤ እንዲሁም ደንበኛው ወደ ኋላ በቀረበት መጠን እየጨመረ ሲሄድ፣ የጥቅል እቅድ ሥራው ከመስመራዊ እድገት ባነሰ መጠን እንዲያድግ ያስችላል። ይህ በተለይ ለትላልቅና በፍጥነት ለሚለዋወጡ ማከማቻዎች አስፈላጊ ነው፤ እነዚህ በሶፍትዌር ልማት አዲሱ መደበኛ ሁኔታ እንደሚሆኑ እንጠብቃለን።

Pandoን መገንባት

Pandoን በCodex ገንብተን፣ ከጅማሬ እስከ ተግባራዊ አገልግሎት በ10 ሳምንታት ብቻ ደርሰናል። የPando ዋና ክፍል በአንድ መሐንዲስ ተነድፎ፣ በወኪሎች ቡድኖች ተገንብቶ፣ በጥቂት መሐንዲሶች ወደ አገልግሎት ገብቷል። Pando በዚህ ዓመት ኤፕሪል ውስጥ ተግባራዊ ጥያቄዎችን ማስተናገድ ጀመረ፤ በOpenAI የሚጠቀሙበት ሰፊ የምንጭ ኮድ ቁጥጥር ማስተዳደሪያ መሣሪያዎች ሥርዓት አንድ ክፍልም ነው።

የPandoን ንድፍ ስናረጋግጥ የተለያዩ አቀራረቦችን ተጠቅመናል። ይበልጥ ደህንነታቸው የተጠበቀ የሶፍትዌር መሠረቶችን ለመገንባት⁠ ያሉንን መርሆች ተግብረናል። ከዜሮ የሚጀምር ፕሮጀክት ስለነበር፣ Pandoን በRust እና ያለ ቆዩ ጥገኛ ክፍሎች ለመገንባት መረጥን። ወኪሎች ለውጦቻቸውን ከመደበኛ የGit አሠራር ጋር ማነጻጸር እንዲችሉ የተስማሚነት ሙከራ ስብስብ ጻፍን። በተጨማሪም፣ የሥርዓቱን የማይለወጡ ሁኔታዎችና ባህሪያት ለመፈተሽ የሚያስችሉ፣ ውጤታቸው የተወሰነ የማስመሰያ ሙከራ መደበቂያዎችን አዘጋጀን። ይህም በድርድርና በጥቅል እቅድ ውስጥ ስውር የእሽቅድምድም ሁኔታዎችንና ወደ ኋላ የሚመልሱ ስህተቶችን እንድናገኝና እንድንቀንስ አስችሎናል።

ብዙ ሞዴሎች ለዚህ ሥርዓት አስተዋጽኦ አድርገዋል፤ አዲስ ሞዴሎች ሲገኙ፣ የPandoን አፈጻጸምና አስተማማኝነት ለማሻሻል ተጠቅመንባቸዋል። ወኪሎች GPT‑6 Astraን ተጠቅመው፣ «የPando ንድፈ ሐሳብ»ን በመደበኛ የሂሳብ መልክ ለመግለጽ Lean እና TLA+ ጻፉ። ይህንም በአተገባበሩ ውስጥ ያሉ ስህተቶችን ለማግኘትና ለማስተካከል፣ የሥርዓቱን ባህሪያትም ለማረጋገጥ ተጠቀምንበት። ብዙ ያልተቋረጡ ክፍለ ጊዜዎች በPando ውስጥ ያሉ አልፎ አልፎ የሚከሰቱ ሁኔታዎችን በማግኘትና በማስተካከል ለመቶዎች ሰዓታት ቆይተዋል። በተጨማሪም፣ የDaybreak አቅም ያላቸውን ሞዴሎች ተጠቅመን Gitንና Pandoን በአጥቂ እይታ ለመፈተሽ ወኪሎችን ቀንና ሌሊት እናስኬዳለን።

Pandoን ወደ አገልግሎት ማስገባት

Pandoን በመጀመሪያ ወደ አገልግሎት ያስገባነው፣ የማንበብና የመጻፍ ጥያቄዎችን ወደ ነባሩ የምንጭ ኮድ ቁጥጥር ሥርዓታችን የሚያስተላልፍ ፕሮክሲ አድርገን ነበር። ይህ Pandoንና የቀድሞውን ሥርዓት ተመሳስለው እንድናቆይ አስችሎናል፤ ስለዚህ አገልግሎት ሳይቋረጥ ጥያቄዎችን በደህና ወደ Pando ማዛወር ቻልን።

የመሸጎጫ ንድፉ አካል እንደመሆኑ፣ Pando ጥያቄዎችን ከማስተላለፉ በፊት የተደጋገሙትን ማስወገድና ማዋሃድ ይችላል። ይህ ሥርዓቶችን አንድ በአንድ ወደ Pando ስናዛውር፣ ነባር መሣሪያዎቻችን በጥሩ ሁኔታ እንዲሠሩ አስችሎናል። ተጨማሪ ሥራዎችን ወደ Pando እያዛወርን ስንሄድ፣ መላኮቻቸው የPandoን መሸጎጫ በውሂብ ሞሉት፣ የቀድሞውን የጀርባ ሥርዓታችንንም አስተማማኝነት አሻሻሉ።

Pandoን ስንጠቀም አፈጻጸምን ለማሻሻል፣ ለሕዝብ ያቀረብነውን የGit ስርጭት ወደ አልሚዎች ማሽኖችና በChatGPT የዴስክቶፕ መተግበሪያ ውስጥ ማቅረብ ጀመርን። ደንበኞችን በደረጃ ወደ Pando ለማዛወር፣ የGit CLIን የሚከብብ ውስጣዊ ፕሮግራም ተጠቀምን። የለውጥ ጥያቄዎችንና የኮድ ግምገማን ለማስተናገድ ብዙ ሌሎች መሣሪያዎችን፣ ለራስ-ሰር ሥራዎችም APIዎችን ፈጠርን። ከGit ጥያቄዎች ጋር፣ በቆዩ APIዎች፣ በዌብሁኮችና በማከማቻ ማውረዶች ላይ የሚመረኮዙ በመቶዎች የሚቆጠሩ ውህደቶችንም አዛወርን።

Codex ራሱ አልሚዎችና ቡድኖች ሽግግሩን እንዲያደርጉ ረዳቸው። ነባር የሥራ ቅጂዎችን ለማዘጋጀትና ወኪሎች አዲሱን ሥርዓት እንዲጠቀሙ ለመምራት ክህሎቶችን ፈጠርን። በዚህም ምክንያት፣ አልሚዎች የልማት አካባቢዎቻቸውንና አገልግሎቶቻቸውን እንዲያዛውር Codexን መጠየቅ ብቻ በቂ ነበር።

ወደ Pando መሸጋገር የማዋሃድ አስተማማኝነትን አሻሽሏል፣ መካከለኛውን የመላክ መዘግየትም በ80% ገደማ ቀንሷል።

Pando በጥቂት የCPU ኮሮች ብቻ በቀን አንድ ፔታባይት የGit ውሂብ ማቅረብ ይችላል። Pando በአንድ ሰዓት ከ57 ቴራባይት በላይ የGit ጥቅሎችን አቅርቧል፤ ከእነዚያ ባይቶች ከ99% በላይ የሚሆኑት ከአካባቢያዊ የዲስክ መሸጎጫ መጥተዋል።

ጥቅሎችን ደጋግሞ መጠቀም፣ ብዙ ደንበኞች ተመሳሳይ የማከማቻ ታሪክን በአገልጋይ ኖዶች ላይ በትንሽ ስሌት እንዲያወርዱ ያስችላቸዋል። ይህ ምሳሌ አንድ ማከማቻ ያሳያል፤ ነገር ግን Pando እጅግ ብዙ ማከማቻዎችን ለመደገፍ ተነድፏል። ፍላጎት እያደገ ሲሄድ፣ የውሂብ ማቅረብንና የGit ድርድርን አቅም ለየብቻ ማስፋት እንችላለን።

ለGit ፕሮጀክት አስተዋጽኦ ማበርከት

Pandoን በGit ፕሮቶኮልና ደንበኛ ላይ መገንባት፣ ስህተቶችንና የGitን ራሱን አፈጻጸም ለማሻሻል ያሉ እድሎችን እንድንለይ ረድቶናል።

ለምሳሌ፣ Pando እንደገና ጥቅም ላይ የሚውሉ ጥቅሎችን በቀጥታ ለደንበኞች ያቀርባል። ስለዚህ እነዚያን ጥቅሎች ማውረድና ማውጫ ማዘጋጀት ሥርዓቱን ፈጣንና አስተማማኝ ለማድረግ ዋና ክፍል ሆኑ። ያ ሥራ በአንድ ጊዜ በሚካሄዱ ማውረዶች፣ ከተቋረጡ ማስተላለፎች በኋላ በሚደረግ ማጽዳት፣ እና ቀድሞ የተጠናቀቁ ማውረዶችን እንደገና በመቀጠል ውስጥ ያሉ ያልተለመዱ ሁኔታዎችን አጋለጠ። እነዚያን የአሠራር መንገዶች አስተካከልን፣ ለማምጣት ነባር ጥቅል ሲቀበል ማረጋገጫዎችን ጨመርን፣ ያንንም ሥራ ለዋናው ፕሮጀክት አበረከትን።

ጊዜና ባንድዊድዝ የት እንደሚወጡም ማየት አስፈልጎን ነበር። ስለዚህ ለ packfile-uri ማውረዶች ክትትልና ለጥቅል ማመንጨት የባይት ቆጠራዎችን ጨመርን። ይህም ዝግ ያለ ማምጣት ጊዜውን የሚፈጀው ጥቅሎችን በማመንጨት ወይም በማስተላለፍ መሆኑን ለመለየት ቀላል አደረገው።

በ የOpenAI የGit ግንባታ⁠(በአዲስ መስኮት ውስጥ ይክፈታል) ውስጥ፣ ደንበኛው ገለልተኛ ጥቅሎችን በትይዩ ማውረድና ማውጫ ማዘጋጀት ይችላል። አገልጋይ የቅርንጫፉን ወቅታዊ ጫፍ፣ የሚልክ ደንበኛ ከጥቅሉ ሊያስቀረው ከሚችለው ታሪክ ለይቶ እንዲያሳውቅ፣ «በግልጽ የተገለጹ ያሉ ኮሚቶች» የሚለውን ጽንሰ ሐሳብ ጨመርን። በPando ላይ፣ ይህ ደንበኞች --force-with-leaseን ተጠቅመው የባህሪ ቅርንጫፉ አለመቀየሩን እንዲያረጋግጡና ጥቅሉን በዋናው ቅርንጫፍ ብቻ ተመርኩዘው እንዲገነቡ ያስችላል። ከዚያ ያንን የዋና ቅርንጫፍ ታሪክ ያለው ማንኛውም ሰው ተመሳሳይ ጥቅል ተጠቅሞ ቅርንጫፉን ማምጣት ይችላል።

ከእነዚህ ማሻሻያዎች ብዙዎቹ ቀድሞውኑ በዋናው Git ውስጥ ገብተዋል፤ ብዙ ሌሎችም በይፋዊ ማከማቻችን ውስጥ አሉ። እነዚህ ማሻሻያዎች ከPando ውጭም ጠቃሚ እንዲሆኑ ከGit ማኅበረሰብ ጋር መሥራታችንን እየቀጠልን ነው። ያንን ሥራ በ ይፋዊ የማሻሻያ መከታተያችን⁠(በአዲስ መስኮት ውስጥ ይክፈታል) መከታተል ይችላሉ።

ቀጣይ እርምጃዎች

የGit ማከማቻዎችን ስለማስፋት የተለመዱ አስተሳሰቦችን እንደገና በማጤን፣ Pando መሐንዲሶቻችንና ወኪሎቻችን የሚጠቀሙባቸውን የGit የሥራ ፍሰቶች ሳንቀይር የተዋሃደ የኮድ ማከማቻችንን እንድናስፋ ያስችለናል። በተዋሃደ የኮድ ማከማቻችን ውስጥ፣ Pando ብዙ ሥራዎችን በአንድ ጊዜ ለማከናወን አስችሏል፣ የማዋሃድ አስተማማኝነትን አሻሽሏል፣ የኮድ ለውጦችን ለማውጣት የሚፈጀውንም ጊዜ ቀንሷል። ከተዋሃደ የኮድ ማከማቻችን ባሻገር፣ ብዙ ወኪሎች በጋራ የGit ማከማቻ ላይ መተባበር የሚያስፈልጋቸውን ሥራዎች ጨምሮ፣ በOpenAI ውስጥ ሌሎች የPando አጠቃቀሞችንም እየመረመርን ነው።

መሐንዲሶችና ወኪሎች ተጨማሪ ሶፍትዌር እያመረቱ ሲሄዱ፣ ከOpenAI ውጭ ያሉ ተጨማሪ ቡድኖች እኛ በምንጭ ኮድ ቁጥጥር ውስጥ ያጋጠሙን ገደቦች ያጋጥሟቸዋል። በአሁኑ ጊዜ Pandoን እውን ያደረገውን ቴክኖሎጂ ለተጠቃሚዎቻችን የምናጋራበትን መንገድ እያጠናን ነው።

Pando በGit ማከማቻ ተጠቃሚዎችና አስተዳዳሪዎች የሁለት አሥርት ዓመታት ልምድ ላይ የተገነባ ነው። ለGit ተጠቃሚዎች በሰፊው የሚጠቅሙ ማሻሻያዎችን ለማጋራት ከክፍት ምንጭ የGit ማኅበረሰብ ጋር እየሠራን፣ Pandoን ማልማት እንቀጥላለን።

ደራሲ

OpenAI