Differences From
Artifact [dafa2dc374]:
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 }