应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

PostgreSQL数据库进程Latchinterproce

  Unix实现使用所谓的自管道(selfpipe)技巧来克服与poll()(或linux上的epollwait())和在信号处理程序中设置全局标志相关的竞争条件。当设置了闩锁并且当前进程正在等待它时,信号处理程序通过向管道写入一个字节来唤醒WaitLatch中的poll()。信号本身不会在所有平台上中断poll(),即使在它中断的平台上,在poll()调用之前到达的信号也不会阻止poll()进入睡眠。然而,管道上的传入字节可靠地中断睡眠,并导致poll()立即返回,即使信号在poll()开始之前到达。
  当从拥有锁存器的同一进程调用SetLatch时,SetLatch将字节直接写入管道。如果它由另一个进程拥有,则发送SIGUSR1并且等待进程中的信号处理程序代表信号进程将字节写入管道。Windows实现使用由所有postmaster子进程继承的Windows事件。那里不需要selfpipe技巧。初始化processlocallatch设施InitializeLatchSupport
  InitializeLatchSupport函数初始化processlocallatch设施。该函数必须在任何进程启动过程中InitLactch或OwnLatch函数调用之前调用。如果是在postmaster子进程中,selfpipeownerpid是用于设置该进程是否拥有selfpipe的标志(拥有selfpipe的进程pid)。如果selfpipeownerpid不为零,说明现在我们子进程继承了postmaster创建的selfpipe的连接。我们想要关闭postmaster创建的selfpipe的连接,然后才可以创建自己的selfpipes。建立运行信号处理函数唤醒WaitLatch函数中的poll、epollwait的selfpipe。
  voidInitializeLatchSupport(void){
  intpipefd〔2〕;
  if(IsUnderPostmaster){在postmaster子进程中
  Wemighthaveinheritedconnectionstoaselfpipecreatedbythe
  postmaster。Itscriticalthatchildprocessescreatetheirown
  selfpipes,ofcourse,andwereallywantthemtoclosethe
  inheritedFDsforsafetyssake。
  if(selfpipeownerpid!0){
  Assertwegothroughherebutonceinachildprocess
  Assert(selfpipeownerpid!MyProcPid);
  ReleasepostmasterspipeFDs;ignoreanyerror释放postmaster的pipeFD
  (void)close(selfpipereadfd);
  (void)close(selfpipewritefd);
  Cleanup,justforsafetyssake;wellsetthesebelow
  selfpipereadfdselfpipewritefd1;
  selfpipeownerpid0;
  }
  else
  {
  Postmasterdidntcreateaselfpipe。。。orelsewereinan
  EXECBACKENDbuild,inwhichcaseitdoesntmattersincethe
  postmasterspipeFDswereclosedbytheactionofFDCLOEXEC。
  Assert(selfpipereadfd1);
  }
  }else{
  Inpostmasterorstandalonebackend,assertwedothisbutonce
  Assert(selfpipereadfd1);
  Assert(selfpipeownerpid0);
  }
  Setuptheselfpipethatallowsasignalhandlertowakeupthe
  poll()epollwait()inWaitLatch。Makethewriteendnonblocking,so
  thatSetLatchwontblockiftheeventhasalreadybeensetmanytimes
  fillingthekernelbuffer。Makethereadendnonblockingtoo,sothat
  wecaneasilyclearthepipebyreadinguntilEAGAINorEWOULDBLOCK。
  Also,makebothFDscloseonexec,sincewesurelydonotwantany
  childprocessesmessingwiththem。
  if(pipe(pipefd)0)elog(FATAL,pipe()failed:m);
  if(fcntl(pipefd〔0〕,FSETFL,ONONBLOCK)1)elog(FATAL,fcntl(FSETFL)failedonreadendofselfpipe:m);
  if(fcntl(pipefd〔1〕,FSETFL,ONONBLOCK)1)elog(FATAL,fcntl(FSETFL)failedonwriteendofselfpipe:m);
  if(fcntl(pipefd〔0〕,FSETFD,FDCLOEXEC)1)elog(FATAL,fcntl(FSETFD)failedonreadendofselfpipe:m);
  if(fcntl(pipefd〔1〕,FSETFD,FDCLOEXEC)1)elog(FATAL,fcntl(FSETFD)failedonwriteendofselfpipe:m);
  selfpipereadfdpipefd〔0〕;
  selfpipewritefdpipefd〔1〕;
  selfpipeownerpidMyProcPid;
  }初始化单个LatchInitLatch
  InitLatch函数初始化进程本地的latch(自己初始化自己的latch)。Latch结构体包含isset、isstared、ownerpid三个成员。
  typedefstructLatch{
  sigatomictisset;
  boolisshared;
  intownerpid;
  }Latch;
  InitLatch函数初始化Latch结构体,isset设置为false,ownerpid为自己的进程pid,isshared设置为false。
  voidInitLatch(Latchlatch){
  latchissetfalse;
  latchownerpidMyProcPid;
  latchissharedfalse;
  AssertInitializeLatchSupporthasbeencalledinthisprocess
  Assert(selfpipereadfd0selfpipeownerpidMyProcPid);
  }InitSharedLatch
  InitSharedLatch初始化一个共享latch(可以从其他进程set这个latch),初始化完latch不属于任何进程,使用OwnLatch将该latch和当前进程关联。InitSharedLatch必须在postmassterfork子进程前由postmaster调用,通常在ShmemInitStruct分配包含Latch的共享内存块之后调用。Notethatotherhandlescreatedinthismodulearenevermarkedasinheritable。ThuswedonotneedtoworryaboutcleaningupchildprocessreferencestopostmasterprivatelatchesorWaitEventSets。
  voidInitSharedLatch(Latchlatch){
  latchissetfalse;
  latchownerpid0;
  latchissharedtrue;
  }OwnLatch
  OwnLatch将一个共享latch关联到当前进程上,允许该进程在该latch上等待。尽管有latch是否有所属的检查,但是我们在这里没有采用任何锁机制,所以我们不能在两个进程在同时对同一个锁竞争所属权时检测出来错误。这种情况下,调用者必须提供一个interlock来包含latch的所属权。任何进程调用OwnLatch函数,必须确保latchsigusr1handler函数由SIGUSR1信号处理handler调用,因为sharedlatch使用SIGUSER1作为进程间通信机制。
  voidOwnLatch(Latchlatch){
  Sanitychecks
  Assert(latchisshared);
  AssertInitializeLatchSupporthasbeencalledinthisprocess
  Assert(selfpipereadfd0selfpipeownerpidMyProcPid);
  if(latchownerpid!0)elog(ERROR,latchalreadyowned);
  latchownerpidMyProcPid;
  }DisownLatch
  DisownLatch将一个共享latch和当前进程解关联
  voidDisownLatch(Latchlatch){
  Assert(latchisshared);
  Assert(latchownerpidMyProcPid);
  latchownerpid0;
  }在Latch上等待WaitLatch
  WaitLatch等待给定的latch被设置,或者是postmasterdeath或者是超时。wakeEvents是用于指定等待哪种类型事件的掩码。如果latch已经被设置(WLLATCHSET已经给定),函数立即返回。
  超时时间以毫秒为单位,如果WLTIMEOUT标志设置了的话,超时时间必须大于等于0。尽管超时时间的类型为log,我们并不支持超时时间长于INTMAX毫秒。
  latch必须由当前进程拥有,才能Wait。比如,itmustbeaprocesslocallatchinitializedwithInitLatch,orasharedlatchassociatedwiththecurrentprocessbycallingOwnLatch。
  返回指示哪种条件导致当前进程在该latch上被唤醒的掩码。如果是多个唤醒条件,我们不能保证在单次调用中返回所有的条件,但是会至少返回一条。
  intWaitLatch(Latchlatch,intwakeEvents,longtimeout,uint32waiteventinfo){
  returnWaitLatchOrSocket(latch,wakeEvents,PGINVALIDSOCKET,timeout,waiteventinfo);
  }WaitLatchOrSocket
  WaitLatch就是调用WaitLatchOrSocket函数,WaitLatchOrSocket比WaitLatch多了一个pgsocket形参(WLSOCKET)。WaitLatch调用时使用PGINVALIDSOCKET,表示是在latch上wait。
  当在一个socket上等待时,EOF和errorconditions总是会导致socket被反馈为readablewritableconnected,所以调用者必须处理这种情况。
  wakeEvents必须包含或者WLEXITONPMDEATH或者是WLPOSTMASTERDEATH。WLEXITONPMDEATH用于在postmasterdie时自动退出。
  WLPOSTMASTERDEATH用于在postmasterdie时在WaitLatchOrSocket函数返回掩码中设置WLPOSTMASTERDEATH标志,以表明postmasterdie。
  intWaitLatchOrSocket(Latchlatch,intwakeEvents,pgsocketsock,longtimeout,uint32waiteventinfo){
  intret0;
  intrc;
  WaitEventevent;
  WaitEventSetsetCreateWaitEventSet(CurrentMemoryContext,3);
  if(wakeEventsWLTIMEOUT)Assert(timeout0);
  elsetimeout1;
  if(wakeEventsWLLATCHSET)
  AddWaitEventToSet(set,WLLATCHSET,PGINVALIDSOCKET,latch,NULL);
  Postmastermanagedcallersmusthandlepostmasterdeathsomehow。
  Assert(!IsUnderPostmaster(wakeEventsWLEXITONPMDEATH)(wakeEventsWLPOSTMASTERDEATH));
  if((wakeEventsWLPOSTMASTERDEATH)IsUnderPostmaster)
  AddWaitEventToSet(set,WLPOSTMASTERDEATH,PGINVALIDSOCKET,NULL,NULL);
  if((wakeEventsWLEXITONPMDEATH)IsUnderPostmaster)
  AddWaitEventToSet(set,WLEXITONPMDEATH,PGINVALIDSOCKET,NULL,NULL);
  if(wakeEventsWLSOCKETMASK){
  intev;
  evwakeEventsWLSOCKETMASK;
  AddWaitEventToSet(set,ev,sock,NULL,NULL);
  }
  rcWaitEventSetWait(set,timeout,event,1,waiteventinfo);
  if(rc0)retWLTIMEOUT;
  elseretevent。events(WLLATCHSETWLPOSTMASTERDEATHWLSOCKETMASK);
  FreeWaitEventSet(set);
  returnret;
  }设置LatchSetLatch
  SetLatch函数设置一个latch,唤醒等待的任何进程。如果在信号处理函数中调用该函数,确保在该函数之前和之后保存和恢复errno。主要工作就是设置latch中的isset,然后唤醒等待的进程(如果有的话)。
  如果是当前进程在等待该latch,说明我们是在信号处理函数中设置的Latch,我们使用selfpipe唤醒poll或epollwait。如果是其他进程在等待该latch,则发送一个SIGUSR1信号。
  voidSetLatch(Latchlatch){
  pidtownerpid;
  Thememorybarrierhastobeplacedheretoensurethatanyflagvariablespossiblychangedbythisprocesshavebeenflushedtomainmemory,beforewechecksetisset。
  pgmemorybarrier();
  Quickexitifalreadyset如果已经设置,直接返回
  if(latchisset)return;
  latchissettrue;
  Seeifanyoneswaitingforthelatch。Itcanbethecurrentprocessif
  wereinasignalhandler。Weusetheselfpipetowakeupthe
  poll()epollwait()inthatcase。Ifitsanotherprocess,senda
  signal。
  Fetchownerpidonlyonce,incasethelatchisconcurrentlygetting
  ownedordisowned。XXX:Thisassumesthatpidtisatomic,whichisnt
  guaranteedtobetrue!Inpractice,theeffectiverangeofpidtfits
  ina32bitinteger,andsoshouldbeatomic。Intheworstcase,we
  mightendupsignalingthewrongprocess。Eventhen,yourevery
  unluckyifaprocesswiththatboguspidexistsandbelongsto
  Postgres;andPGdatabaseprocessesshouldhandleexcessSIGUSR1
  interruptswithoutaproblemanyhow。
  Anothersortofraceconditionthatspossiblehereisforanew
  processtoownthelatchimmediatelyafterwelook,sowedontsignal
  it。ThisisokaysolongasallcallersofResetLatchWaitLatchfollow
  thestandardcodingconventionofwaitingatthebottomoftheirloops,
  notthetop,sothattheyllcorrectlyprocesslatchsettingevents
  thathappenbeforetheyentertheloop。
  ownerpidlatchownerpid;
  if(ownerpid0)return;
  elseif(ownerpidMyProcPid){
  if(waiting)sendSelfPipeByte();
  }
  elsekill(ownerpid,SIGUSR1);
  }
  仅获取ownerpid一次,以防闩锁同时被拥有或被剥夺。XXX:这假设pidt是原子的,这不能保证是真的!实际上,pidt的有效范围适合32位整数,因此应该是原子的。在最坏的情况下,我们可能最终会发出错误的过程信号。即便如此,如果存在带有该伪造pid的进程并且属于Postgres,那你就很不走运了;PG数据库进程应该可以毫无问题地处理过多的SIGUSR1中断。另一种可能的竞争条件是新进程在我们查看后立即拥有锁存器,因此我们不发出信号。只要ResetLatchWaitLatch的所有调用者都遵循在循环底部而不是顶部等待的标准编码约定,这样就可以正确处理在进入循环之前发生的闩锁设置事件。latchsigusr1handler
  SetLatch使用SIGUSR1唤醒在latch上等待的进程。如果我们在等待,唤醒WaitLatch。
  voidlatchsigusr1handler(void){
  if(waiting)sendSelfPipeByte();
  }
  ResetLatch
  清除latch的isset。在该函数调用之后调用WaitLatch会进入睡眠,除非在调用WaitLatch之前latch又被设置了。
  voidResetLatch(Latchlatch){
  Assert(latchownerpidMyProcPid);Onlytheownershouldresetthelatch
  latchissetfalse;
  Ensurethatthewritetoissetgetsflushedtomainmemorybeforewe
  examineanyflagvariables。OtherwiseaconcurrentSetLatchmight
  falselyconcludethatitneedntsignalus,eventhoughwehavemissed
  seeingsomeflagupdatesthatSetLatchwassupposedtoinformusof。
  pgmemorybarrier();
  }

寒潮来袭欧亚争气进入12月,欧洲多国陆续迎来寒潮。虽然今年欧洲大陆的严冬比以往来得晚,但天气预报显示,此次降温可能会更加猛烈。相应地,欧洲国家出现能源短缺的风险也变得越来越高。能源危机尚……外卖电商的寒冬来了?国家正式出手,实体店焕发第二春本文原创,请勿抄袭和搬运,违者必究外卖和电商是互联网行业的最大特色,也在这两大行业中诞生出美团,阿里巴巴等互联网巨头。基本上国内市值靠前的民营企业都来自互联网领域,借助外……护航梨花季吃喝玩乐新津市场监管来保障!保障梨花季阳春三月又迎来百花绽放的季节蛰伏一冬的小伙伴们赶紧踏青赏花约起来3月8日咱们新津第22届梨花季已盛大开幕梨花溪景……恭喜!中国19岁新星首次晋级冬奥会决赛,澳大利亚名将冲击第二2022年2月14日,冬奥会多场雪上比赛继续进行,单板滑雪女子大跳台,中国19岁新星荣格创造历史,她在第一跳出现失误的情况下,凭借后面两跳的成绩排名资格赛第九位,首次晋级决赛,……全面迎接旅游复苏?全日空发布新品牌AirJapan,走中端亲中文导报讯(记者乔马奇)去年此时,舆论还在哀叹航空业因疫情影响而一蹶不振,空乘们不得不纷纷跑去收麦子卖水产改行以自救。不到一年,日本的航空业已蓄势待发,全面拥抱与疫情共存的全球……80年代农村儿童娱乐几乎以前上过学的小孩都会唱的让我们荡起双桨,为什么会有一种淡淡的忧伤呢。有在音乐方面颇有造诣的说那是因为这首歌是用小调五声音阶谱写,天然带有忧伤的基因。更有聪明人说过去你以为那……年度十大热歌全是短视频BGM,华语歌曲还会有人听吗?你没听错,在来自某平台盛典公布的2021年度十大热歌,全部都是短视频的BGM,虽然各大平台把热歌和金曲分开进行排行,但是还是难免被比较,为什么金曲都不如短视频BGM火,真的有人……北京冬奥会一台冬奥会期间的脊柱外科手术新华社河北崇礼2月12日电(记者黄垚、郭雅茹)在北京冬奥会开幕的第三天,刘啸就主刀了一台手术。刘啸正在查房,了解患者情况。受访者供图开幕前一天,一名外籍滑雪运动员在……CBA三消息马尚伤势加重,李春江无缘最佳,辽宁队进攻篮板第一本赛季的广东队突然给人一种很弱的感觉,特别是遇到强队时几乎输掉了所有比赛,所以恐怕连杜锋对于能不能卫冕心里都没有底。在赵睿因伤缺席的那个阶段广东队还遭遇了连败,得分创造了多年以……细数那些红毯盛典有人衣品堪忧,有人美如天仙,有人艳冠群芳2022年伊始,娱乐圈已经有了新气象,明星们有不少突破,有新造型,也有新发型。显然,大家都开始在衣品造型上下大功夫了。历来,红毯都是明星们争奇斗艳的地方。那就让我们来看一……原创歌词二首原创歌词二首文孙书林春天又到来桃花红,梨花白,飘香的春天又到来。冬眠的小熊睡醒了,快乐的小鸟唱起来。蝴蝶飞,雁归来,美丽的春天又……为何酒店的总统套房一晚价格上万?这5项隐形服务物超所值现如今,随着酒店行业的发展,推出了各色各样的客房,而其中,颠覆国民消费观的就是总统套房,住一晚就要花费上万元,但是依然有顾客买单。(此处已添加小程序,请到今日头条客户端查看)……
重庆瑞丽缅甸陆海新通道又一新线路打通!华龙网新重庆客户端讯(赵颖竹)4月3日,陆海新通道跨境铁公联运班列(重庆瑞丽缅甸)从江津珞璜临港产业城小南垭铁路物流中心发出,将通过瑞丽市畹町口岸出口至缅甸。这是国内开行的首趟……广东电信与广东海大签约,产教融合协同育人为加强校企合作,深化产教融合,推进人才强企,3月30日上午,中国电信广东公司、中国电信湛江分公司与广东海洋大学举行座谈交流,举行校企合作签约仪式。广东电信与广东海大签约……詹姆斯每场比赛都有所不同相比得分今天球队更需要我组织直播吧4月3日讯今日NBA常规赛,湖人在客场以134109大胜火箭,赛后,詹姆斯接受了记者采访。记者问道:哈姆与里夫斯说你很厉害的一点是你可以在比赛中寻找最佳打法,今天你……容祖儿的时尚看不懂,内衣外穿配纱裙,不俗反而大气出生于香港的容祖儿,是一位优秀的歌手,舞台驾驭能力出色,自带气场的她,港风味道十足,外形条件相当出众。都说娱乐圈似乎从来都不缺漂亮女生,但是,有句话说长得美是条件,会打扮才是能……恭喜!47岁李霄鹏升官,二进宫豪门,权力不降反升,改变争冠格李霄鹏成为国足史上最短命主帅,他带队1平3负从未取得胜利,如今他被扬科维奇取代。但据《足球报》记者李璇坦言,当初李霄鹏上任,完全是足协想找个替罪羊,而他本人丝毫没有接班李铁的兴……混凝土机械行业加快绿色转型!200台三一新能源纯电动搅拌车批湖南日报2月25日讯(全媒体记者曹娴)2月25日,全国最大批量电动混凝土成套设备交付仪式在江苏盐城举行。这批设备均由三一重工打造,首批交付80台电动搅拌车、40个充电桩、2台电……限制进入中国市场?苹果收到警告,外媒这是要硬刚到底大家都知道,苹果之所以会成为智能手机行业的标杆,不仅仅是因为iPhone创新的外观设计,还与苹果内在的竞争力有很大关系。比如自有IOS操作系统、自有A系列处理器、自有生态服务等……香港各界财政预算案助香港巩固经济复苏动力这是2月23日拍摄的香港城市风光。新华社记者陈铎摄新华社香港2月24日电(记者王茜)新一届香港特区政府首份财政预算案日前出炉。香港特区政府财政司司长陈茂波认为,中长期看香……清退进行时!这类银行卡将被注销日前,中国银行公告称,自3月20日起,该行将对连续18个月及以上无主动交易、且无任何未偿款项和存款的长期睡眠信用卡分阶段进行降额、停用或销卡等相关处理。信用卡新规发布已7……昊华能源索赔案又迎来开庭审理涉诉讼金额已超亿元投资者诉昊华能源(601101)证券虚假陈述责任纠纷一案,2月16日在北京金融法院迎来又一批案件的开庭审理。该案件前期已有一审判决结果,法院判决公司需对投资者承担相应赔偿责任。……武陵山大裂谷,绝美的地球伤痕十里峡谷雄阔壮美,谷底奇石叠垒、溪流淙淙,位于重庆涪陵的武陵山大裂谷是剧烈地壳运动造就的伤痕,有铜墙铁壁、如来神掌、将军石、青天峡地缝等奇幻景观。图说:武陵山大裂谷新民晚……柳海光中国足球的第一代锋霸,两次冲出亚洲87年10月26日,汉城奥运会预选赛最后一轮比赛,中国队客战日本。9月开始的奥预赛第二阶段比赛,中国跟日本、泰国和尼泊尔分在一组,按照当时的规则小组第一晋级决赛圈。……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网