isle/docs/dev/daemon-process-tree.svg
Brian Picciano b35a3d6574 First public commit
There has been over 1 year of commit history leading up to this point,
but almost all of that has had some kind network configuration or
secrets built into the code. As of today all of that has been removed,
and the codebase can finally be published!

I am keeping a private copy of the previous commit history, though it's
unclear if it will ever be able to be published.
2022-07-04 15:18:55 -06:00

90 lines
19 KiB
XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="693px" preserveAspectRatio="none" style="width:2672px;height:693px;" version="1.1" viewBox="0 0 2672 693" width="2672px" zoomAndPan="magnify"><defs><filter height="300%" id="f136koxildkhhk" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><!--MD5=[94d69829b8642ebae4272c0fe4460dd1]
cluster AppDir--><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="570" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="2653" x="7" y="111"/><rect fill="#FFFFFF" height="537.7031" rx="12.5" ry="12.5" style="stroke:#FFFFFF;stroke-width:1.0;" width="2647" x="10" y="140.2969"/><line style="stroke:#A80036;stroke-width:1.5;" x1="7" x2="2660" y1="137.2969" y2="137.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="46" x="1310" y="127.9951">AppDir</text><path d="M1830.75,159.5 L1830.75,184.6328 L2193.75,184.6328 L2193.75,169.5 L2183.75,159.5 L1830.75,159.5 " fill="#FBFB77" filter="url(#f136koxildkhhk)" style="stroke:#A80036;stroke-width:1.0;"/><path d="M2183.75,159.5 L2183.75,169.5 L2193.75,169.5 L2183.75,159.5 " fill="#FBFB77" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="342" x="1836.75" y="176.5669">All relative paths are relative to the root of the AppDir</text><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="40" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="407" x="23.75" y="613"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="397" x="28.75" y="637.8467">./bin/dnsmasq -d -C $_RUNTIME_DIR_PATH/dnsmasq.conf</text><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="40" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="380" x="466" y="613"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="370" x="471" y="637.8467">./bin/nebula -config $_RUNTIME_DIR_PATH/nebula.yml</text><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="40" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="417" x="1432.75" y="613"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="407" x="1437.75" y="637.8467">./bin/garage -c $_RUNTIME_DIR_PATH/garage-N.toml server</text><g id="AppDir.AppRun"><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="50.2656" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="176" x="869.5" y="147"/><line style="stroke:#A80036;stroke-width:1.5;" x1="869.5" x2="1045.5" y1="173.2969" y2="173.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="64" x="925.5" y="164.9951">./AppRun</text><ellipse cx="880" cy="184.7656" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="145" x="885.5" y="189.4355">Set PATH to APPDIR/bin</text></g><g id="AppDir.entrypoint"><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="92.1719" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="298" x="808.5" y="275"/><line style="stroke:#A80036;stroke-width:1.5;" x1="808.5" x2="1106.5" y1="301.2969" y2="301.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="105" x="905" y="292.9951">./bin/entrypoint</text><ellipse cx="819" cy="312.7656" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="260" x="824.5" y="317.4355">Merge given and default daemon.yml files</text><ellipse cx="819" cy="326.7344" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="267" x="824.5" y="331.4043">Create runtime dir at $_RUNTIME_DIR_PATH</text><ellipse cx="819" cy="340.7031" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="100" x="824.5" y="345.373">Lock runtime dir</text><ellipse cx="819" cy="354.6719" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="126" x="824.5" y="359.3418">Run child processes</text></g><g id="AppDir.dnsmasqEntrypoint"><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="50.2656" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="301" x="364.75" y="459"/><line style="stroke:#A80036;stroke-width:1.5;" x1="364.75" x2="665.75" y1="485.2969" y2="485.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="174" x="428.25" y="476.9951">./bin/dnsmasq-entrypoint</text><ellipse cx="375.25" cy="496.7656" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="270" x="380.75" y="501.4355">Create $_RUNTIME_DIR_PATH/dnsmasq.conf</text></g><g id="AppDir.nebulaEntrypoint"><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="50.2656" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="280" x="817" y="459"/><line style="stroke:#A80036;stroke-width:1.5;" x1="817" x2="1097" y1="485.2969" y2="485.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="157" x="878.5" y="476.9951">./bin/nebula-entrypoint</text><ellipse cx="827.5" cy="496.7656" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="249" x="833" y="501.4355">Create $_RUNTIME_DIR_PATH/nebula.yml</text></g><g id="AppDir.nebulaUpdateGlobalBucket"><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="64.2344" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="516" x="881" y="601"/><line style="stroke:#A80036;stroke-width:1.5;" x1="881" x2="1397" y1="627.2969" y2="627.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="235" x="1021.5" y="618.9951">./bin/nebula-update-global-bucket</text><ellipse cx="891.5" cy="638.7656" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="132" x="897" y="643.4355">Runs once then exits</text><ellipse cx="891.5" cy="652.7344" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="485" x="897" y="657.4043">Updates network topo data in garage global bucket (used for bootstrapping)</text></g><g id="AppDir.garageEntrypoint"><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="78.2031" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="302" x="1665" y="445"/><line style="stroke:#A80036;stroke-width:1.5;" x1="1665" x2="1967" y1="471.2969" y2="471.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="158" x="1737" y="462.9951">./bin/garage-entrypoint</text><ellipse cx="1675.5" cy="482.7656" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="271" x="1681" y="487.4355">Create $_RUNTIME_DIR_PATH/garage-N.toml</text><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="177" x="1678" y="501.4043">(one per storage allocation)</text><ellipse cx="1675.5" cy="510.7031" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="126" x="1681" y="515.373">Run child processes</text></g><g id="AppDir.garageApplyLayoutDiff"><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="64.2344" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="215" x="1884.75" y="601"/><line style="stroke:#A80036;stroke-width:1.5;" x1="1884.75" x2="2099.75" y1="627.2969" y2="627.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="195" x="1894.75" y="618.9951">./bin/garage-apply-layout-diff</text><ellipse cx="1895.25" cy="638.7656" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="132" x="1900.75" y="643.4355">Runs once then exits</text><ellipse cx="1895.25" cy="652.7344" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="133" x="1900.75" y="657.4043">Updates cluster topo</text></g><g id="AppDir.garageUpdateGlobalBucket"><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="64.2344" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="509" x="2134.75" y="601"/><line style="stroke:#A80036;stroke-width:1.5;" x1="2134.75" x2="2643.75" y1="627.2969" y2="627.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="236" x="2271.25" y="618.9951">./bin/garage-update-global-bucket</text><ellipse cx="2145.25" cy="638.7656" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="132" x="2150.75" y="643.4355">Runs once then exits</text><ellipse cx="2145.25" cy="652.7344" fill="#000000" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:0.0;"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="478" x="2150.75" y="657.4043">Updates cluster topo data in garage global bucket (used for bootstrapping)</text></g><rect fill="#FEFECE" filter="url(#f136koxildkhhk)" height="40" rx="12.5" ry="12.5" style="stroke:#A80036;stroke-width:1.5;" width="267" x="823.75" y="7"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="257" x="828.75" y="31.8467">./cryptic-net daemon -c ./daemon.yml</text><!--MD5=[99e1226540a30c5125aeac95dc2932fd]
link init to AppRun--><path d="M957,47.286 C957,71.544 957,113.432 957,141.669 " fill="none" id="init-to-AppRun" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="957,146.775,961,137.775,957,141.775,953,137.775,957,146.775" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="30" x="958" y="90.0669">exec</text><!--MD5=[973be3d7ea581194d5ee3fc39a24a200]
link AppRun to entrypoint--><path d="M957,197.274 C957,216.916 957,245.239 957,269.727 " fill="none" id="AppRun-to-entrypoint" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="957,274.89,961,265.89,957,269.89,953,265.89,957,274.89" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="30" x="958" y="240.0669">exec</text><!--MD5=[083a25c5b19d53ca66969ca5947a1cf6]
link entrypoint to dnsmasqEntrypoint--><path d="M833.291,367.062 C753.357,396.178 652.208,433.022 585.652,457.265 " fill="none" id="entrypoint-to-dnsmasqEntrypoint" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="580.92,458.988,590.7454,459.6679,585.6183,457.2776,588.0087,452.1505,580.92,458.988" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="29" x="750" y="410.0669">child</text><!--MD5=[c7ea69d4ff6721f817d13683540cf18f]
link dnsmasqEntrypoint to dnsmasq--><path d="M467.765,509.109 C412.619,537.257 322.234,583.391 269.3,610.4093 " fill="none" id="dnsmasqEntrypoint-to-dnsmasq" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="264.612,612.8024,274.4467,612.274,269.0655,610.5295,270.81,605.1483,264.612,612.8024" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="30" x="381" y="566.0669">exec</text><!--MD5=[e57db689e698a4cac2a90f0a38fcb110]
link entrypoint to nebulaEntrypoint--><path d="M957,367.276 C957,394.946 957,429.531 957,453.654 " fill="none" id="entrypoint-to-nebulaEntrypoint" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="957,458.94,961,449.94,957,453.94,953,449.94,957,458.94" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="29" x="958" y="410.0669">child</text><!--MD5=[b8917cf0c8fa712950e6c2e129fc0a6a]
link nebulaEntrypoint to nebula--><path d="M907.633,509.109 C849.882,537.314 755.153,583.577 699.876,610.5721 " fill="none" id="nebulaEntrypoint-to-nebula" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="695.309,612.8024,705.1514,612.447,699.8018,610.6081,701.6406,605.2585,695.309,612.8024" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="30" x="816" y="566.0669">exec</text><!--MD5=[5f8fdfeb0a5dc67ee4d5669420a40cee]
link nebulaEntrypoint to nebulaUpdateGlobalBucket--><path d="M987.054,509.274 C1016.84,533.331 1062.74,570.409 1096.31,597.5169 " fill="none" id="nebulaEntrypoint-to-nebulaUpdateGlobalBucket" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="1100.34,600.7717,1095.8541,592.0038,1096.4511,597.629,1090.8258,598.226,1100.34,600.7717" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="29" x="1059" y="566.0669">child</text><!--MD5=[b16f4e4f6f0194775e8cc00ba594229f]
link entrypoint to garageEntrypoint--><path d="M1105.65,349.86 C1260.51,378.885 1502.11,424.169 1659.74,453.713 " fill="none" id="entrypoint-to-garageEntrypoint" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="1664.85,454.67,1656.7492,449.0685,1659.9369,453.7417,1655.2638,456.9294,1664.85,454.67" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="371" x="1438" y="410.0669">child (only if &gt;1 storage allocation defined in daemon.yml)</text><!--MD5=[7604ba225da9a0d6f108d03d7e486e8b]
link garageEntrypoint to garage--><path d="M1751,523.167 C1737.29,532.283 1723.27,542.451 1711,553 C1691.4,569.852 1672.15,592.116 1658.81,608.712 " fill="none" id="garageEntrypoint-to-garage" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="1655.55,612.8026,1664.2851,608.2531,1658.6643,608.891,1658.0265,603.2702,1655.55,612.8026" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="210" x="1712" y="566.0669">child (one per storage allocation)</text><!--MD5=[7472d79ac569d4db6634ba16e8ae6010]
link garageEntrypoint to garageApplyLayoutDiff--><path d="M1886.99,523.008 C1901.21,531.996 1915.58,542.153 1928,553 C1942.71,565.84 1956.65,582.331 1967.75,596.922 " fill="none" id="garageEntrypoint-to-garageApplyLayoutDiff" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="1970.8,600.9825,1968.5758,591.3881,1967.7899,596.9901,1962.1879,596.2042,1970.8,600.9825" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="29" x="1946" y="566.0669">child</text><!--MD5=[28040088c0886f2a1ce0f5a6f1c646b2]
link garageEntrypoint to garageUpdateGlobalBucket--><path d="M1964.31,523.047 C2056.9,546.8 2174.81,577.05 2262.88,599.645 " fill="none" id="garageEntrypoint-to-garageUpdateGlobalBucket" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="2267.84,600.9183,2260.1167,594.8067,2262.9969,599.6755,2258.1282,602.5556,2267.84,600.9183" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="29" x="2137" y="566.0669">child</text><!--MD5=[8f4ad328989dd844abfc0d21ccc0f169]
@startuml
hide empty description
state "./cryptic-net daemon -c ./daemon.yml" as init
state AppDir {
note "All relative paths are relative to the root of the AppDir" as N1
state "./AppRun" as AppRun {
AppRun : * Set PATH to APPDIR/bin
}
state "./bin/entrypoint" as entrypoint {
entrypoint : * Merge given and default daemon.yml files
entrypoint : * Create runtime dir at $_RUNTIME_DIR_PATH
entrypoint : * Lock runtime dir
entrypoint : * Run child processes
}
init - -> AppRun : exec
AppRun - -> entrypoint : exec
state "./bin/dnsmasq-entrypoint" as dnsmasqEntrypoint {
dnsmasqEntrypoint : * Create $_RUNTIME_DIR_PATH/dnsmasq.conf
}
state "./bin/dnsmasq -d -C $_RUNTIME_DIR_PATH/dnsmasq.conf" as dnsmasq
entrypoint - -> dnsmasqEntrypoint : child
dnsmasqEntrypoint - -> dnsmasq : exec
state "./bin/nebula-entrypoint" as nebulaEntrypoint {
nebulaEntrypoint : * Create $_RUNTIME_DIR_PATH/nebula.yml
}
state "./bin/nebula -config $_RUNTIME_DIR_PATH/nebula.yml" as nebula
state "./bin/nebula-update-global-bucket" as nebulaUpdateGlobalBucket {
nebulaUpdateGlobalBucket : * Runs once then exits
nebulaUpdateGlobalBucket : * Updates network topo data in garage global bucket (used for bootstrapping)
}
entrypoint - -> nebulaEntrypoint : child
nebulaEntrypoint - -> nebula : exec
nebulaEntrypoint - -> nebulaUpdateGlobalBucket : child
state "./bin/garage-entrypoint" as garageEntrypoint {
garageEntrypoint : * Create $_RUNTIME_DIR_PATH/garage-N.toml\n (one per storage allocation)
garageEntrypoint : * Run child processes
}
state "./bin/garage -c $_RUNTIME_DIR_PATH/garage-N.toml server" as garage
state "./bin/garage-apply-layout-diff" as garageApplyLayoutDiff {
garageApplyLayoutDiff : * Runs once then exits
garageApplyLayoutDiff : * Updates cluster topo
}
state "./bin/garage-update-global-bucket" as garageUpdateGlobalBucket {
garageUpdateGlobalBucket : * Runs once then exits
garageUpdateGlobalBucket : * Updates cluster topo data in garage global bucket (used for bootstrapping)
}
entrypoint - -> garageEntrypoint : child (only if >1 storage allocation defined in daemon.yml)
garageEntrypoint - -> garage : child (one per storage allocation)
garageEntrypoint - -> garageApplyLayoutDiff : child
garageEntrypoint - -> garageUpdateGlobalBucket : child
}
@enduml
PlantUML version 1.2021.3(Mon Mar 22 16:53:19 UTC 2021)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Default Encoding: ANSI_X3.4-1968
Language: en
Country: US
--></g></svg>