parsav  Diff

Differences From Artifact [dafa2dc374]:

To Artifact [1938b717c7]:


     1      1   -- vim: ft=terra
     2      2   local util = lib.util
     3      3   local secmode = lib.enum { 'public', 'private', 'lockdown', 'isolate' }
     4      4   local pstring = lib.mem.ptr(int8)
     5      5   
     6      6   local struct srv
     7      7   local struct cfgcache {
            8  +	_pool: lib.mem.pool
     8      9   	secret: pstring
     9     10   	pol_sec: secmode.t
    10     11   	pol_reg: bool
    11     12   	pol_autoherald: bool
    12     13   	credmgd: bool
    13     14   	maxupsz: intptr
    14     15   	poolinitsz: intptr
................................................................................
    30     31   	webmgr: lib.net.mg_mgr
    31     32   	webcon: &lib.net.mg_connection
    32     33   	cfg: cfgcache
    33     34   	id: rawstring
    34     35   	pool: lib.mem.pool
    35     36   }
    36     37   
    37         -terra cfgcache:free() -- :/ TODO replace with pool
    38         -	self.secret:free()
    39         -	self.instance:free()
    40         -	self.domain:free()
    41         -	self.ui_cue_staff:free()
    42         -	self.ui_cue_founder:free()
    43         -	self.usrdef_pol_follow:free()
    44         -	self.usrdef_pol_follow_req:free()
           38  +terra cfgcache:purge()
           39  +	self._pool:clear()
           40  +end
           41  +
           42  +terra cfgcache:free()
           43  +	self._pool:free()
    45     44   end
    46     45   
    47     46   terra srv:post_enum_author_uid(uid: uint64, r: lib.store.range): lib.mem.vec(lib.mem.ptr(lib.store.post))
    48     47   	var all: lib.mem.vec(lib.mem.ptr(lib.store.post)) all:init(64)
    49     48   	for i=0,self.sources.ct do var src = self.sources.ptr + i
    50     49   		if src.handle ~= nil and src.backend.timeline_instance_fetch ~= nil then
    51     50   			var lst = src:post_enum_author_uid(uid,r)
................................................................................
   375    374   								co:complain(400,'bad request','unrecognized content-type')
   376    375   								goto fail
   377    376   							end
   378    377   							var boundary = pstring {ptr=p+9,ct=ctt.ct - ((p - ctt.ptr) + 9)}
   379    378   							co.method = lib.http.method.post_file
   380    379   							co.uploads:init(8)
   381    380   
   382         -							var bsr = (lib.str.acc{}):compose('\r\n--',boundary,'\r\n'):finalize()
          381  +							var bsr = co:qstr('\r\n--',boundary,'\r\n')
   383    382   
   384    383   							var upmap = lib.str.splitmap(co.body,bsr,8)
   385    384   							-- first entry may not be preceded by header-break
   386    385   							if lib.str.find(upmap(0), pstring {
   387    386   								ptr = bsr.ptr + 2, ct = bsr.ct - 2
   388    387   							}):ref() then
   389    388   								upmap(0).ptr = upmap(0).ptr + (bsr.ct - 2)
................................................................................
   451    450   												nextup.field = fld
   452    451   												nextup.filename = file
   453    452   											end
   454    453   										end
   455    454   									end
   456    455   								end
   457    456   							end
   458         -							bsr:free()
   459    457   							upmap:free()
   460    458   						end
   461    459   					end
   462    460   				end
   463    461   
   464         -				var mtt = lib.http.mime._str(co.reqtype)
   465         -				lib.dbg('routing with negotiated type of ', {mtt.ptr,mtt.ct})
   466    462   				route.dispatch_http(&co, uri)
   467    463   
   468    464   				::fail::
   469    465   				if co.uploads.run > 0 then
   470    466   					for i=0,co.uploads.sz do
   471    467   						co.uploads(i).filename:free()
   472    468   						co.uploads(i).field:free()
................................................................................
   654    650   --
   655    651   --	return 0
   656    652   --end
   657    653   
   658    654   terra cfgcache.methods.load :: {&cfgcache} -> {}
   659    655   terra cfgcache:init(o: &srv)
   660    656   	self.overlord = o
          657  +	self._pool:init(256)
   661    658   	self:load()
   662    659   end
   663    660   
   664    661   terra srv:setup(befile: rawstring)
   665    662   	cfg(self, befile)
   666    663   	var success = false
   667    664   	if self.sources.ct == 0 then lib.bail('no data sources specified') end
................................................................................
   675    672   	end
   676    673   end
   677    674   
   678    675   terra srv:start(iname: rawstring)
   679    676   	self:conprep(lib.store.prepmode.full)
   680    677   	self.cfg:init(self)
   681    678   	self.pool:init(self.cfg.poolinitsz)
   682         -	var dbbind = self:conf_get('bind')
          679  +	var dbbind = self:conf_get(&self.pool, 'bind')
   683    680   	if iname == nil then iname = lib.proc.getenv('parsav_instance') end
   684    681   	if iname == nil then
   685    682   		self.id = self.cfg.instance.ptr;
   686    683   		-- let this leak -- it'll be needed for the lifetime of the process anyway
   687    684   	else self.id = iname end 
   688    685   
   689    686   	if iname ~= nil then
................................................................................
   698    695   		bind = dbbind.ptr
   699    696   	else bind = '[::1]:10917' end
   700    697   
   701    698   	lib.report('binding to ', bind)
   702    699   	lib.net.mg_mgr_init(&self.webmgr)
   703    700   	self.webcon = lib.net.mg_http_listen(&self.webmgr, bind, handle.http, self)
   704    701   
   705         -	if dbbind.ptr ~= nil then dbbind:free() end
          702  +	--if dbbind.ptr ~= nil then dbbind:free() end
   706    703   end
   707    704   
   708    705   terra srv:poll()
   709    706   	lib.net.mg_mgr_poll(&self.webmgr,300)
   710    707   end
   711    708   
   712    709   terra srv:shutdown()
................................................................................
   715    712   		lib.report('closing data source ', src.id.ptr, '(', src.backend.id, ')')
   716    713   		src:close()
   717    714   	end
   718    715   	self.sources:free()
   719    716   	self.pool:free()
   720    717   end
   721    718   
   722         -terra cfgcache:cfint(name: rawstring, default: intptr)
   723         -	var str = self.overlord:conf_get(name)
          719  +terra cfgcache:cfstr(name: pstring)
          720  +	return self.overlord:conf_get(&self._pool, name)
          721  +end
          722  +
          723  +terra cfgcache:cfint(name: pstring, default: intptr)
          724  +	var f = self._pool:frame()
          725  +	var str = self:cfstr(name)
          726  +	defer self._pool:reset(f)
   724    727   	if str.ptr ~= nil then
   725    728   		var i,ok = lib.math.decparse(str)
   726    729   		if ok then default = i else
   727         -			lib.warn('invalid configuration setting ',name,'="',{str.ptr,str.ct},'", expected integer; using default value instead')
          730  +			lib.warn('invalid configuration setting ',{name.ptr,name.ct},'="',{str.ptr,str.ct},'", expected integer; using default value instead')
   728    731   		end
   729         -		str:free()
   730    732   	end
   731    733   	return default
   732    734   end
   733    735   
   734         -terra cfgcache:cffsz(name: rawstring, default: intptr)
   735         -	var str = self.overlord:conf_get(name)
          736  +terra cfgcache:cffsz(name: pstring, default: intptr)
          737  +	var f = self._pool:frame()
          738  +	var str = self:cfstr(name)
          739  +	defer self._pool:reset(f)
   736    740   	if str:ref() then
   737    741   		var sz, ok = lib.math.fsz_parse(str)
   738    742   		if ok then default = sz else
   739         -			lib.warn('invalid configuration setting ',name,'="',{str.ptr,str.ct},'", expected byte length; using default value instead')
          743  +			lib.warn('invalid configuration setting ',{name.ptr,name.ct},'="',{str.ptr,str.ct},'", expected byte length; using default value instead')
   740    744   		end
   741         -		str:free()
   742    745   	end
   743    746   	return default
   744    747   end
   745    748   
   746         -terra cfgcache:cfbool(name: rawstring, default: bool)
   747         -	var str = self.overlord:conf_get(name)
          749  +terra cfgcache:cfbool(name: pstring, default: bool)
          750  +	var f = self._pool:frame()
          751  +	var str = self:cfstr(name)
          752  +	defer self._pool:reset(f)
   748    753   	if str.ptr ~= nil then
   749    754   		if str:cmp('true') or str:cmp('on') or
   750    755   		   str:cmp('yes')  or str:cmp('1') then
   751    756   			default = true
   752    757   		elseif str:cmp('false') or str:cmp('off') or
   753    758   		       str:cmp('no')    or str:cmp('0') then
   754    759   			default = false
   755    760   		else
   756         -			lib.warn('invalid configuration setting ',name,'="',{str.ptr,str.ct},'", expected boolean; using default value instead')
          761  +			lib.warn('invalid configuration setting ',{name.ptr,name.ct},'="',{str.ptr,str.ct},'", expected boolean; using default value instead')
   757    762   		end
   758         -		str:free()
   759    763   	end
   760    764   	return default
   761    765   end
   762    766   
   763    767   terra cfgcache:load()
   764         -	self.instance = self.overlord:conf_get('instance-name')
   765         -	self.domain = self.overlord:conf_get('domain')
   766         -	self.secret = self.overlord:conf_get('server-secret')
          768  +	
          769  +	self.instance = self:cfstr('instance-name')
          770  +	self.domain = self:cfstr('domain')
          771  +	self.secret = self:cfstr('server-secret')
   767    772   
   768    773   	self.pol_reg = self:cfbool('policy-self-register', false)
   769    774   	self.pol_autoherald = self:cfbool('policy-self-herald', true)
   770    775   
   771    776   	do self.credmgd = false
   772         -	var sreg = self.overlord:conf_get('credential-store')
          777  +	var fr = self._pool:frame()
          778  +	var sreg = self:cfstr('credential-store')
   773    779   	if sreg:ref() then
   774    780   		if lib.str.cmp(sreg.ptr, 'managed') == 0
   775    781   			then self.credmgd = true
   776    782   			else self.credmgd = false
   777    783   		end
   778         -		sreg:free()
          784  +		self._pool:reset(fr)
   779    785   	end end
   780    786   
   781    787   	self.maxupsz = self:cffsz('maximum-artifact-size', [1024 * 100]) -- 100 kilobyte default
   782    788   	self.poolinitsz = self:cffsz('server-pool-size-initial', [1024 * 10]) -- 10 kilobyte default
   783    789   	
   784    790   	self.pol_sec = secmode.lockdown
   785         -	var smode = self.overlord:conf_get('policy-security')
          791  +	do var fr = self._pool:frame()
          792  +	var smode = self:cfstr('policy-security')
   786    793   	if smode.ptr ~= nil then
   787    794   		if lib.str.cmp(smode.ptr, 'public') == 0 then
   788    795   			self.pol_sec = secmode.public
   789    796   		elseif lib.str.cmp(smode.ptr, 'private') == 0 then
   790    797   			self.pol_sec = secmode.private
   791    798   		elseif lib.str.cmp(smode.ptr, 'lockdown') == 0 then
   792    799   			self.pol_sec = secmode.lockdown
   793    800   		elseif lib.str.cmp(smode.ptr, 'isolate') == 0 then
   794    801   			self.pol_sec = secmode.isolate
   795    802   		end
   796         -		smode:free()
   797         -	end
          803  +		self._pool:reset(fr)
          804  +	end end
   798    805   
   799    806   	self.ui_hue = self:cfint('ui-accent',config.default_ui_accent)
   800    807   	self.nranks = self:cfint('user-ranks',10)
   801    808   	self.maxinvites = self:cfint('max-invites',64)
   802    809   	
   803         -	var webmaster = self.overlord:conf_get('master')
   804         -	if webmaster:ref() then defer webmaster:free()
          810  +	do var fr = self._pool:frame()
          811  +	var webmaster = self:cfstr('master')
          812  +	defer self._pool:reset(fr)
          813  +	if webmaster:ref() then 
   805    814   		var wma = self.overlord:actor_fetch_xid(webmaster)
   806    815   		if not wma then
   807    816   			lib.warn('the webmaster specified in the configuration store does not seem to exist or is not known to this instance; preceding as if no master defined. if the master is a remote user, you can rectify this with the `actor "',{webmaster.ptr,webmaster.ct},'" instantiate` and `conf refresh` commands')
   808    817   		else
   809    818   			self.master = wma(0).id
   810    819   			wma:free()
   811    820   		end
   812         -	end
          821  +	end end
   813    822   
   814         -	self.ui_cue_staff = self.overlord:conf_get('ui-profile-cue-staff')
   815         -	self.ui_cue_founder = self.overlord:conf_get('ui-profile-cue-master')
          823  +	self.ui_cue_staff = self:cfstr('ui-profile-cue-staff')
          824  +	self.ui_cue_founder = self:cfstr('ui-profile-cue-master')
   816    825   
   817         -	self.usrdef_pol_follow = self.overlord:conf_get('user-default-acl-follow')
   818         -	self.usrdef_pol_follow_req = self.overlord:conf_get('user-default-acl-follow-req')
          826  +	self.usrdef_pol_follow = self:cfstr('user-default-acl-follow')
          827  +	self.usrdef_pol_follow_req = self:cfstr('user-default-acl-follow-req')
   819    828   end
   820    829   
   821    830   return {
   822    831   	overlord = srv;
   823    832   	convo = convo;
   824    833   	route = route;
   825    834   	secmode = secmode;
   826    835   }