1
1
mirror of https://github.com/mgree/ffs.git synced 2024-07-07 08:16:20 +03:00

Timing support (#46)

Benchmarks, in two flavors: real-world benchmarks and synthetic microbenchmarks.

`--time` flag for benchmarking output on stderr.

Using R to generate pretty graphs. Some overhaul of build scripts and artifacts, with the hope of simplifying the release system.
This commit is contained in:
Michael Greenberg 2021-07-29 17:55:53 -07:00 committed by GitHub
parent b651c9c1ac
commit 6ed74ee0c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
82 changed files with 322846 additions and 67 deletions

View File

@ -32,9 +32,71 @@ jobs:
- name: Build ffs and run unit tests
run: |
cargo build --verbose --all
cargo build --verbose --all --release
cargo test
- name: Integration tests
run: PATH="$(pwd)/target/debug:$PATH" ./run_tests.sh
run: PATH="$(pwd)/target/release:$PATH" ./run_tests.sh
- name: Install R
uses: r-lib/actions/setup-r@v1
- name: Benchmarks
run: |
Rscript -e "install.packages('ggplot2', repos = 'https://cloud.r-project.org/')"
PATH="$(pwd)/target/release:$PATH" ./run_bench.sh -n 3
mkdir data
for x in *.log *.png
do
mv $x data/${x##*_}
done
- name: Upload macOS release build
uses: actions/upload-artifact@v2
if: ${{ matrix.os == 'macos-latest' }}
with:
name: ffs.macos
path: target/release/ffs
- name: Upload Linux release build
uses: actions/upload-artifact@v2
if: ${{ matrix.os == 'ubuntu-latest' }}
with:
name: ffs.linux
path: target/release/ffs
- name: Upload macOS benchmark data
uses: actions/upload-artifact@v2
if: ${{ matrix.os == 'macos-latest' }}
with:
name: benchmarks.macos
path: data
- name: Upload Linux benchmark data
uses: actions/upload-artifact@v2
if: ${{ matrix.os == 'ubuntu-latest' }}
with:
name: benchmarks.linux
path: data
prerelease:
runs-on: ubuntu-latest
if: ${{ github.ref == 'refs/heads/main' }}
steps:
- name: Download binaries
uses: actions/download-artifact@v2
- name: Deploy 'latest' release
uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "latest"
prerelease: true
title: "Latest development build"
files: |
ffs.linux/ffs.linux
ffs.macos/ffs.macos

3
.gitignore vendored
View File

@ -1,2 +1,5 @@
/target
*~
*.log
*.png
.Rhistory

View File

@ -6,6 +6,8 @@
code.
* Revise exit codes: 0 means success, 1 means FS error, 2 means CLI
error.
* `--time` flag for emitting timing information on STDERR.
* Basic startup/shutdown benchmarking, with microbenchmarks.
## 0.1.1 - 2021-07-15

2
bench/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
__pycache__/
micro

2281
bench/20210727_run.log Normal file

File diff suppressed because it is too large Load Diff

19
bench/README.md Normal file
View File

@ -0,0 +1,19 @@
To run benchmarks, run `run_bench.sh` (in the repo root).
Files for benchmarking. Each directory is from a different source.
- synthetic (artificial, hand-crafted examples)
- json_org (https://json.org examples)
- gh (GitHub API https://api.github.com/)
- ncdc (NCDC NOAA API https://www.ncdc.noaa.gov/cdo-web/webservices/v2)
- gov.uk (https://gov.uk)
- penn (Penn Museum https://www.penn.museum/collections/objects/data.php)
- doi (https://www.doi.org/factsheets/DOIProxy.html#rest-api)
- penguin (http://www.penguinrandomhouse.biz/webservices/rest/)
- rv (Rig Veda https://aninditabasu.github.io/indica/html/rv.html)
- fda (https://open.fda.gov/apis/)
https://github.com/public-apis/public-apis is a useful meta-source.
We generate micro-benchmarks using `mk_micro.sh`, which will wipe out
and recreate the directory `micro`.

216
bench/bench.sh Executable file
View File

@ -0,0 +1,216 @@
#!/bin/sh
CLEANUP=
CLEANUP_DIR=
PIDS=
tempfile() {
file=$(mktemp)
CLEANUP="$CLEANUP $file"
eval "$1=$file"
}
tempdir() {
dir=$(mktemp -d)
CLEANUP_DIR="$CLEANUP $dir"
eval "$1=$dir"
}
cleanup() {
for file in $CLEANUP
do
[ "$file" ] && [ -f "$file" ] && rm "$file" >/dev/null 2>&1
done
CLEANUP=""
for dir in $CLEANUP_DIR
do
[ "$dir" ] && [ -f "$dir" ] && rmdir "$dir" >/dev/null 2>&1
done
CLEANUP_DIR=""
for pid in $PIDS
do
kill $pid >/dev/null 2>&1
done
PIDS=""
}
if [ "$RUNNER_OS" = "Linux" ] || [ "$(uname)" = "Linux" ]; then
filesize() {
stat --printf=%s $1
}
elif [ "$RUNNER_OS" = "macOS" ] || [ "$(uname)" = "Darwin" ]; then
filesize() {
stat -f "%z" $1
}
else
echo "The benchmark suite only runs on macOS and Linux." >&2
exit 3
fi
trap 'cleanup' EXIT
trap 'echo "Interrupted!"; cleanup; exit' INT
NUM_RUNS_DEFAULT=10
usage() {
exec >&2
printf "Usage: %s [-n NUM_RUNS] [-d DIR] [PATTERNS ...]\n\n" "$(basename $0)"
printf " -d DIR runs tests in DIR only\n"
printf " -n NUM_RUNS the number of runs for each test case (defaults to $NUM_RUNS_DEFAULT)\n"
printf " PATTERNS regular expression patterns for grep; tests matching any pattern will be run (defaults .*)\n"
exit 2
}
while getopts ":n:d:h" opt
do
case "$opt" in
(n) if [ $((OPTARG)) -le 0 ]
then
printf "NUM_RUNS must be a positive number; got '%s'\n\n" "$OPTARG"
usage
fi
NUM_RUNS=$OPTARG
;;
(d) if ! [ -d "$OPTARG" ]
then
printf "No such directory '%s'." "$OPTARG"
exit 1
fi
DIRS="$OPTARG"
;;
(h) usage
;;
(*) printf "Unrecognized argument '%s'\n\n" "$OPTARG"
usage
;;
esac
done
shift $((OPTIND - 1))
if [ $# -ge 1 ]
then
PATTERN="$1"
shift
for kw in "$@"
do
PATTERN="$PATTERN\|$kw"
done
fi
TIMEOUT="$(cd ../utils; pwd)/timeout"
: ${NUM_RUNS=$NUM_RUNS_DEFAULT}
run_digits=$(( ${#NUM_RUNS} ))
: ${FFS=$(dirname $0)/../target/release/ffs}
: ${PATTERN=".*"}
: ${DIRS=doi fda gh gov.uk json.org ncdc penguin penn rv synthetic}
# GENERATE PLAN
# each file gets $NUM_RUNS runs, in a random order
tempfile all
tempfile plan
dir_len=0
for d in $DIRS
do
for f in $(ls $d)
do
for r in $(seq 1 $NUM_RUNS)
do
echo $d,$f,$r >>$all
path="$d/$f"
if [ "${#path}" -gt $dir_len ]
then
dir_len=${#path}
fi
done
done
done
# randomize, and then sort by 'run' number
sort -R $all | sort -k 3 -t , -s -n >$plan
total_runs=$(( $(cat $plan | wc -l) ))
total_digits=${#total_runs}
# EXECUTE PLAN
tempdir mnt
printf "source,file,run,size,activity,ns\n" "$d" "$f" "$r" "$size" "$line" # header
errors=""
has_error() {
case "$errors" in
(*$1*) return 0;;
esac
return 1
}
errored() {
if ! has_error $1
then
errors="$errors $1"
fi
kill $PID >/dev/null 2>&1
[ -d $mnt ] && umount $mnt >/dev/null 2>&1
[ -f $log ] && rm $log
}
run=0
for entry in $(cat $plan | grep -e "$PATTERN")
do
d=$(echo $entry | cut -d, -f1)
f=$(echo $entry | cut -d, -f2)
r=$(echo $entry | cut -d, -f3)
path="$d/$f"
: $((run += 1))
printf "%${total_digits}d/%d %${dir_len}s " "$run" "$total_runs" "$path" >&2
if has_error "$path"
then
printf "(errored earlier; skipping)\n" >&2
continue
else
printf "(copy %${run_digits}d)\n" "$r" >&2
fi
tempfile log
tempfile out
$FFS --time -m $mnt -o $out -t json $path 2>$log &
PID=$!
PIDS="$PIDS $PID"
count=0
while ! umount $mnt >/dev/null 2>&1
do
sleep $count
if [ "$count" -le 5 ]
then
: $((count += 1))
else
printf "%$((2 * total_digits + 1))s warning: couldn't unmount for $path\n" ' ' >&2
errored $path
continue 2
fi
done
count=0
while kill -0 $PID >/dev/null 2>&1
do
sleep $count
if [ "$count" -le 2 ]
then
: $((count += 1))
else
printf "%$((2 * total_digits + 1))s warning: $PID still running for $path" ' ' >&2
errored $path
continue 2
fi
done
size=$(filesize $path)
while read line
do
printf "%s,%s,%s,%s,%s\n" "$d" "$f" "$r" "$size" "$line"
done <$log
done

View File

@ -0,0 +1 @@
{"responseCode":1,"handle":"10.1000/1","values":[{"index":100,"type":"HS_ADMIN","data":{"format":"admin","value":{"handle":"0.NA/10.1000","index":200,"permissions":"011111111111"}},"ttl":86400,"timestamp":"2014-09-26T14:40:46Z"},{"index":1,"type":"URL","data":{"format":"string","value":"http://www.doi.org/index.html"},"ttl":86400,"timestamp":"2014-09-26T14:40:46Z"}]}

View File

@ -0,0 +1 @@
{"responseCode":1,"handle":"10.1145/3458336.3465294","values":[{"index":1,"type":"URL","data":{"format":"string","value":"https://dl.acm.org/doi/10.1145/3458336.3465294"},"ttl":86400,"timestamp":"2021-06-04T02:18:21Z"},{"index":700050,"type":"700050","data":{"format":"string","value":"2021060318573100415"},"ttl":86400,"timestamp":"2021-06-04T02:18:21Z"},{"index":100,"type":"HS_ADMIN","data":{"format":"admin","value":{"handle":"0.na/10.1145","index":200,"permissions":"111111110010"}},"ttl":86400,"timestamp":"2021-06-04T02:18:21Z"}]}

62
bench/fda/event.json Normal file
View File

@ -0,0 +1,62 @@
{
"meta": {
"disclaimer": "Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service.",
"terms": "https://open.fda.gov/terms/",
"license": "https://open.fda.gov/license/",
"last_updated": "2021-05-10",
"results": {
"skip": 0,
"limit": 1,
"total": 13306102
}
},
"results": [
{
"receiptdateformat": "102",
"receiver": null,
"seriousnessdeath": "1",
"companynumb": "JACAN16471",
"receivedateformat": "102",
"primarysource": {
"reportercountry": "CANADA",
"qualification": "3"
},
"transmissiondateformat": "102",
"fulfillexpeditecriteria": "1",
"safetyreportid": "5801206-7",
"sender": {
"senderorganization": "FDA-Public Use"
},
"receivedate": "20080707",
"patient": {
"patientonsetage": "26",
"patientonsetageunit": "801",
"patientsex": "1",
"patientdeath": {
"patientdeathdateformat": null,
"patientdeathdate": null
},
"reaction": [
{
"reactionmeddrapt": "DRUG ADMINISTRATION ERROR"
},
{
"reactionmeddrapt": "OVERDOSE"
}
],
"drug": [
{
"drugcharacterization": "1",
"medicinalproduct": "DURAGESIC-100",
"drugauthorizationnumb": "019813",
"drugadministrationroute": "041",
"drugindication": "DRUG ABUSE"
}
]
},
"transmissiondate": "20090109",
"serious": "1",
"receiptdate": "20080625"
}
]
}

80662
bench/fda/event100.json Normal file

File diff suppressed because it is too large Load Diff

906
bench/fda/recall.json Normal file
View File

@ -0,0 +1,906 @@
{
"meta": {
"disclaimer": "Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service.",
"terms": "https://open.fda.gov/terms/",
"license": "https://open.fda.gov/license/",
"last_updated": "2021-07-11",
"results": {
"skip": 0,
"limit": 1,
"total": 348
}
},
"results": [
{
"event_date_initiated": "2019-05-17",
"city": "Reading",
"address_1": "2400 Bernville Rd",
"reason_for_recall": "Lidstock contains a labeling error. The lidstock shows the catheter cross section of the gauge (GA) values in a reversed manner.",
"product_code": "FOZ",
"code_info": "Lot/Batch Numbers: 13F18C0374, 13F18H0580, 13F18D0504, 13F18L0507,  13F18E0380, 13F18L0714, 13F18G0180, 13F18L0936,  13F18G0480",
"product_quantity": "3,143",
"additional_info_contact": "Customer Service\n866-396-2111",
"action": "On May 17, 2019, Arrow International issued Urgent Medical Device and Acknowledgement notices to customers via courier service. \r\n \r\nCustomers should take the following actions:\r\n1. Place a copy of the notification with each unit of affected product currently in your inventory.\r\n2. After step (1) is complete, fill out the enclosed Acknowledgement Form and fax it to 1-855-419-8507, Attn: Customer Service or email it to recalls@teleflex.com.\r\n\r\nDistributors should take the following actions:\r\n1. Place a copy of the notification with each unit of affected product currently in your inventory.\r\n2. Using the provided customer letter template and acknowledgement form, communicate the notification to any of your customers who have received product included within the scope of the notification.\r\n3. Have each of your customers who received the affected product return a completed acknowledgement form to you.\r\n4. Once you have finished collecting and consolidating all of the acknowledgement forms from your customers and placing a copy of the notification with each unit of affected product in your inventory, please completed the enclosed Distributor Acknowledgement Form and fax it to 1-855-\r\n419-8507, Attn: Customer Service or email it to recalls@teleflex.com. This will allow us to document completion of this field action\r\n\r\nIf you have any other questions, feel free to contact\r\nyour local sales representative or Customer Service at 1-866-396-2111.",
"distribution_pattern": "US Nationwide Distribution",
"k_numbers": [
"K900263"
],
"firm_fei_number": "2518433",
"state": "PA",
"product_description": "Pediatric Two-Lumen Central Venous Catheterization\nKit with Blue FlexTip ARROWg+ard Blue Catheter, REF AK-25502\n\nProduct Usage; Provide short-term (< 30 days) central venous access for treatment of diseases or conditions requiring central venous access",
"root_cause_description": "Employee error",
"event_date_created": "2019-10-07",
"openfda": {
"k_number": [
"K940634",
"K984614",
"K912165",
"K140419",
"K984059",
"K844219",
"K912563",
"K840815",
"K012128",
"K021130",
"K981368",
"K013800",
"K834255",
"K944968",
"K811171",
"K851101",
"K010410",
"K113700",
"K830539",
"K001616",
"K910566",
"K813396",
"K060174",
"K132153",
"K834480",
"K932946",
"K200373",
"K013556",
"K821679",
"K982558",
"K823565",
"K881666",
"K200263",
"K080793",
"K875082",
"K081420",
"K090973",
"K760163",
"K980493",
"K110443",
"K971339",
"K920028",
"K992532",
"K770181",
"K822776",
"K013182",
"K090502",
"K823351",
"K926405",
"K883980",
"K193158",
"K073520",
"K993691",
"K123734",
"K902527",
"K121488",
"K872585",
"K151698",
"K112542",
"K033853",
"K000997",
"K862480",
"K120337",
"K011967",
"K910564",
"K111236",
"K881767",
"K943023",
"K904558",
"K111366",
"K071538",
"K990236",
"K911251",
"K895734",
"K874582",
"K833092",
"K984055",
"K850278",
"K000087",
"K960013",
"K944660",
"K914528",
"K002142",
"K151513",
"K110794",
"K932789",
"K971991",
"K931668",
"K830765",
"K901263",
"K991406",
"K904121",
"K121007",
"K903347",
"K011982",
"K860290",
"K011297",
"K944367",
"K974015",
"K191232",
"K990308",
"K844193",
"K112347",
"K860256",
"K052564",
"K000665",
"K905009",
"K083429",
"K163358",
"K970864",
"K130518",
"K844113",
"K931729",
"K923702",
"K861117",
"K024007",
"K183399",
"K061250",
"K953811",
"K791918",
"K945521",
"K043446",
"K021557",
"K051355",
"K954112",
"K192533",
"K990390",
"K153280",
"K960764",
"K002786",
"K152272",
"K896774",
"K984189",
"K020785",
"K970736",
"K884325",
"K052881",
"K904648",
"K910572",
"K964048",
"K092629",
"K821372",
"K161777",
"K853348",
"K033500",
"K150611",
"K850460",
"K864038",
"K190001",
"K854308",
"K192230",
"K964050",
"K800525",
"K171530",
"K890751",
"K884806",
"K981905",
"K090122",
"K872998",
"K944368",
"K150407",
"K921955",
"K001795",
"K100282",
"K192676",
"K945053",
"K141026",
"K143610",
"K060341",
"K790914",
"K800786",
"K861510",
"K852078",
"K895942",
"K861479",
"K772354",
"K112290",
"K850349",
"K901701",
"K081113",
"K884701",
"K926097",
"K850369",
"K192493",
"K160592",
"K894371",
"K972264",
"K821699",
"K953120",
"K861725",
"K834073",
"K850887",
"K850276",
"K946170",
"K915065",
"K840862",
"K160235",
"K000235",
"K901640",
"K801537",
"K032417",
"K840355",
"K140270",
"K873050",
"K834393",
"K161779",
"K962577",
"K950118",
"K003187",
"K073241",
"K982805",
"K970669",
"K113622",
"K010406",
"K963196",
"K973561",
"K780350",
"K102520",
"K162377",
"K861015",
"K941678",
"K150109",
"K952645",
"K142797",
"K833091",
"K993515",
"K924968",
"K142136",
"K153298",
"K182252",
"K022756",
"K010021",
"K172506",
"K981382",
"K833135",
"K842577",
"K862153",
"K812159",
"K011860",
"K942045",
"K935090",
"K160374",
"K895191",
"K170336",
"K864949",
"K871546",
"K850398",
"K920133",
"K770511",
"K161866",
"K841880",
"K884577",
"K854566",
"K933050",
"K790967",
"K140136",
"K830573",
"K201717",
"K833657",
"K993518",
"K940441",
"K100974",
"K182538",
"K032962",
"K962226",
"K926544",
"K812137",
"K821577",
"K880260",
"K801575",
"K830541",
"K013287",
"K912358",
"K860474",
"K944511",
"K172204",
"K930048",
"K003245",
"K033843",
"K032274",
"K821371",
"K073471",
"K121073",
"K010034",
"K032292",
"K884259",
"K193278",
"K915824",
"K894611",
"K070705",
"K893003",
"K883415",
"K042862",
"K851142",
"K071382",
"K190855",
"K843033",
"K992198",
"K881215",
"K801414",
"K905415",
"K830972",
"K974543",
"K042504",
"K040427",
"K964966",
"K070020",
"K113565",
"K870403",
"K203069",
"K895768",
"K900116",
"K964049",
"K032777",
"K172496",
"K173354",
"K953252",
"K802918",
"K914180",
"K891087",
"K140504",
"K790968",
"K954887",
"K021139",
"K082997",
"K910565",
"K904150",
"K000632",
"K033250",
"K955053",
"K162894",
"K022099",
"K903732",
"K953335",
"K770403",
"K943349",
"K072419",
"K963867",
"K770751",
"K954428",
"K853701",
"K023253",
"K931073",
"K163513",
"K120839",
"K100775",
"K921270",
"K091709",
"K896813",
"K983409",
"K083454",
"K950301",
"K003553",
"K932071",
"K920828",
"K133856",
"K895812",
"K941417",
"K972262",
"K780105",
"K062108",
"K893546",
"K050114",
"K053120",
"K883866",
"K821929",
"K944410",
"K200266",
"K944504",
"K932947",
"K032843",
"K122544",
"K770510",
"K960051",
"K961552",
"K950737",
"K840116",
"K013073",
"K123267",
"K902135",
"K940775",
"K983916",
"K970644",
"K070451",
"K813345",
"K974764",
"K980566",
"K772011",
"K823017",
"K951620",
"K905463",
"K063469",
"K955839",
"K904122",
"K881976",
"K862130",
"K081690",
"K920635",
"K141138",
"K912158",
"K801941",
"K030479",
"K113429",
"K131555",
"K903545",
"K900056",
"K923323",
"K851327",
"K834227",
"K832624",
"K940385",
"K992732",
"K910799",
"K840183",
"K984590",
"K875177",
"K052389",
"K920638",
"K972254",
"K200891",
"K133280",
"K803238",
"K931027",
"K950284",
"K881236",
"K900263",
"K760319",
"K853988",
"K041345",
"K822023",
"K890435",
"K002033",
"K952861",
"K182870",
"K914378",
"K771573",
"K962938",
"K093546",
"K953805",
"K111939",
"K813374",
"K030571",
"K771381",
"K972263",
"K081953",
"K920128",
"K011937",
"K971990",
"K851981",
"K832558",
"K170283",
"K082362",
"K933467",
"K944302",
"K842133",
"K895597",
"K882242",
"K161681",
"K952058",
"K952256",
"K952757",
"K201075",
"K944336",
"K833079",
"K893965"
],
"registration_number": [
"3000268902",
"2032112",
"1000563940",
"3014758767",
"9680794",
"3006621386",
"3015724078",
"2025816",
"1055927",
"3012783688",
"3009220482",
"3008770691",
"3002807314",
"3002806603",
"3011237770",
"3007616112",
"8020616",
"9680091",
"3016784016",
"8021545",
"3006948478",
"3010413216",
"8010026",
"3014477782",
"1410248",
"3014101058",
"2011171",
"3009211636",
"1000163068",
"1282497",
"3014656749",
"3004111573",
"1048014",
"3006846316",
"3011357022",
"3010055973",
"2030624",
"3003895440",
"9680143",
"3012307300",
"1650907",
"1820334",
"9612126",
"3003418325",
"1710034",
"8041187",
"3008403546",
"9617594",
"1928237",
"3010882065",
"3015060232",
"3006260740",
"1219611",
"2024024",
"1625425",
"3006942602",
"3012494290",
"3005034064",
"2032758",
"3013298431",
"3012050423",
"3012542015",
"9610849",
"3003674698",
"3016727301",
"3000247873",
"1721686",
"3010384323",
"3010425778",
"3008496528",
"3010605677",
"2029214",
"1319639",
"2527072",
"9616157",
"3005515211",
"9615588",
"1721676",
"3003442380",
"3003915875",
"3012809732",
"3002806470",
"3012636179",
"2523676",
"1018233",
"3012627824",
"3010220595",
"3010392988",
"3006082230",
"2245270",
"3006979819",
"3008307705",
"9616088",
"3012232810",
"3006425876",
"1043214",
"2246552",
"3011137372",
"9610987",
"3012421607",
"3015751263",
"3015522053",
"3017892510",
"3005011024",
"3007054491",
"9680437",
"3015859709",
"2029015",
"2244478",
"3016678045",
"3012104670",
"3005941719",
"1319211",
"9611446",
"9617592",
"3005246939",
"2648045",
"9610993",
"3009380063",
"8040227",
"3013654137",
"3010131137",
"3013517171",
"1647137",
"2243072",
"2532083",
"3004134316",
"3010532612",
"9610847",
"3002533790",
"3013659863",
"2518433",
"2184009",
"1644312",
"1223004",
"2518902",
"1123137",
"3004187702",
"1419629",
"8020889",
"8043983",
"1061124",
"3010754844",
"9681835",
"3009249481",
"3015422213",
"8020785",
"3015550451",
"2183744",
"3002807350",
"9616567",
"1065831",
"1000523114",
"8031563",
"1036844",
"3006367242",
"3003902955",
"3010041511",
"3009291251",
"1423537",
"3005987240",
"1035907",
"3002601200",
"3011088743",
"8041145",
"3013561886",
"1713468",
"3015997711",
"1038445",
"9610048",
"1220905",
"1000587249",
"9612086",
"1030583",
"2015691",
"3012410077",
"3014270673",
"9617604",
"3010421104",
"3004129394",
"3013082799",
"3003618391",
"3008410596",
"3017219795",
"3007207906",
"3001124136",
"3015474943",
"9610825",
"3011689956",
"3012798826",
"9612433",
"3003916417",
"3004784537",
"3013557562"
],
"fei_number": [
"1000117748",
"3000268902",
"3003076831",
"3002468371",
"1000563940",
"3002808465",
"3014758767",
"3002808464",
"3006621386",
"3015724078",
"2025816",
"3012783688",
"3002807111",
"3009220482",
"3000206435",
"3008770691",
"3002807314",
"3002806603",
"3011237770",
"3002681132",
"3002807548",
"3007616112",
"3003910417",
"3016784016",
"3006948478",
"3010413216",
"3014477782",
"1410248",
"3002806830",
"3014101058",
"2011171",
"3009211636",
"1000163068",
"1282497",
"3002808374",
"3014656749",
"3004111573",
"1048014",
"3006846316",
"3011357022",
"3010055973",
"3003895440",
"3002973487",
"3012307300",
"1820334",
"3003418325",
"1710034",
"3003218564",
"2828",
"3008403546",
"3002963732",
"1928237",
"3002806482",
"3003737899",
"3015060232",
"3002939122",
"3006260740",
"3002807710",
"1219611",
"2024024",
"3003382061",
"3003807466",
"3006097687",
"1625425",
"3012494290",
"3006942602",
"3005034064",
"3013298431",
"3012050423",
"3002806476",
"3012542015",
"3003674698",
"3016727301",
"3002974635",
"3000247873",
"1721686",
"3010384323",
"3010425778",
"3008496528",
"3010605677",
"3002807725",
"1000174591",
"2527072",
"3005515211",
"1721676",
"3003442380",
"3003915875",
"3012809732",
"3002806470",
"3012636179",
"2523676",
"1018233",
"3012627824",
"3010220595",
"3010392988",
"3006082230",
"1000120555",
"2245270",
"3006979819",
"3008307705",
"3005747797",
"3012232810",
"3006425876",
"1043214",
"2246552",
"3012421607",
"3015522053",
"3015751263",
"3017892510",
"3005011024",
"1000512168",
"3007054491",
"1000306068",
"3015859709",
"3016678045",
"3002879021",
"3012104670",
"1319211",
"3005246939",
"2648045",
"1000123180",
"3002807391",
"1000477110",
"3009380063",
"3002558692",
"3013654137",
"3010131137",
"3013517171",
"2243072",
"3004134316",
"3010532612",
"3002533790",
"3013659863",
"2518433",
"1000160458",
"1000136269",
"2518902",
"3004187702",
"1419629",
"3010754844",
"3003752255",
"3001236905",
"1000116158",
"3009249481",
"3015422213",
"3003169040",
"3015550451",
"2183744",
"3002807350",
"1000523114",
"3002808345",
"3006367242",
"1036844",
"3003902955",
"3010041511",
"3009291251",
"3005987240",
"1035907",
"1000162947",
"3002601200",
"3011088743",
"3013561886",
"1713468",
"3015997711",
"1038445",
"1220905",
"1000587249",
"1030583",
"2015691",
"3012410077",
"3014270673",
"3010421104",
"3002902735",
"3004129394",
"3002807308",
"3013082799",
"3004053914",
"3008410596",
"3017219795",
"3003618391",
"3001124136",
"3015474943",
"3007207906",
"3002806575",
"1000220862",
"3011689956",
"3012798826",
"3002806469",
"3003560965",
"3002806593",
"1000113359",
"3004784537",
"3013557562",
"1000138054"
],
"device_name": "Catheter, Intravascular, Therapeutic, Short-Term Less Than 30 Days",
"medical_specialty_description": "General Hospital",
"regulation_number": "880.5200",
"device_class": "2"
},
"event_date_terminated": "2020-09-24",
"recalling_firm": "Arrow International Inc",
"product_res_number": "Z-0053-2020",
"recall_status": "Terminated",
"res_event_number": "82984",
"postal_code": "19605-9607"
}
]
}

8915
bench/fda/recall10.json Normal file

File diff suppressed because it is too large Load Diff

89043
bench/fda/recall100.json Normal file

File diff suppressed because it is too large Load Diff

44521
bench/fda/recall50.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,100 @@
{
"meta": {
"disclaimer": "Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service.",
"terms": "https://open.fda.gov/terms/",
"license": "https://open.fda.gov/license/",
"last_updated": "2021-07-12",
"results": {
"skip": 0,
"limit": 1,
"total": 304808
}
},
"results": [
{
"proprietary_name": [
"Optical Coherence Tomography OCT-A1"
],
"establishment_type": [
"Develop Specifications But Do Not Manufacture At This Facility"
],
"registration": {
"registration_number": "1000181430",
"fei_number": "1000181430",
"status_code": "1",
"initial_importer_flag": "N",
"reg_expiry_date_year": "2021",
"name": "CANON INC.",
"address_line_1": "9-1, Imaikami-cho, Nakahara-ku",
"address_line_2": "",
"city": "Kawasaki Kanagawa",
"state_code": "",
"iso_country_code": "JP",
"zip_code": "",
"postal_code": "211-8501",
"us_agent": {
"name": "MASAYUKI TAKEUCHI",
"business_name": "Canon Medical Components U.S.A., Inc.",
"bus_phone_area_code": "631",
"bus_phone_num": "3308587",
"bus_phone_extn": "",
"fax_area_code": "",
"fax_num": "",
"email_address": "mtakeuchi@mcu.canon",
"address_line_1": "15955",
"address_line_2": "Alton Parkway",
"city": "Irvine",
"state_code": "CA",
"iso_country_code": "US",
"zip_code": "92618",
"postal_code": ""
},
"owner_operator": {
"firm_name": "CANON INC.",
"owner_operator_number": "8030410",
"official_correspondent": {},
"contact_address": {
"address_1": "30-2 SHIMOMARUKO, 3-CHOME,",
"address_2": "OHTA-KU",
"city": "TOKYO",
"state_code": "JP-NOTA",
"state_province": "",
"iso_country_code": "JP",
"postal_code": "146-8501"
}
}
},
"pma_number": "",
"k_number": "K182942",
"products": [
{
"product_code": "HLI",
"created_date": "2019-07-24",
"owner_operator_number": "8030410",
"exempt": "",
"openfda": {
"device_name": "Ophthalmoscope, Ac-Powered",
"medical_specialty_description": "Ophthalmic",
"regulation_number": "886.1570",
"device_class": "2"
}
},
{
"product_code": "OBO",
"created_date": "2019-07-24",
"owner_operator_number": "8030410",
"exempt": "",
"openfda": {
"k_number": [
"K182942"
],
"device_name": "Tomography, Optical Coherence",
"medical_specialty_description": "Ophthalmic",
"regulation_number": "886.1570",
"device_class": "2"
}
}
]
}
]
}

File diff suppressed because it is too large Load Diff

33
bench/fda/tobacco.json Normal file
View File

@ -0,0 +1,33 @@
{
"meta": {
"disclaimer": "Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service.",
"terms": "https://open.fda.gov/terms/",
"license": "https://open.fda.gov/license/",
"last_updated": "2021-04-30",
"results": {
"skip": 0,
"limit": 1,
"total": 1042
}
},
"results": [
{
"date_submitted": "02/03/2020",
"nonuser_affected": "No",
"reported_health_problems": [
"Petit mal",
"Seizures"
],
"number_tobacco_products": 1,
"number_health_problems": 2,
"report_id": 2079781,
"reported_product_problems": [
"No information provided"
],
"tobacco_products": [
"Electronic cigarette, electronic nicotine or vaping product (E-cigarette, e-cigars, e-hookahs, e-pipes, vape pens, hookah pens, and personal vaporizers; E-liquids, e-juice or vape juice)"
],
"number_product_problems": 0
}
]
}

194
bench/fda/tobacco10.json Normal file
View File

@ -0,0 +1,194 @@
{
"meta": {
"disclaimer": "Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service.",
"terms": "https://open.fda.gov/terms/",
"license": "https://open.fda.gov/license/",
"last_updated": "2021-04-30",
"results": {
"skip": 0,
"limit": 10,
"total": 1042
}
},
"results": [
{
"date_submitted": "02/03/2020",
"nonuser_affected": "No",
"reported_health_problems": [
"Petit mal",
"Seizures"
],
"number_tobacco_products": 1,
"number_health_problems": 2,
"report_id": 2079781,
"reported_product_problems": [
"No information provided"
],
"tobacco_products": [
"Electronic cigarette, electronic nicotine or vaping product (E-cigarette, e-cigars, e-hookahs, e-pipes, vape pens, hookah pens, and personal vaporizers; E-liquids, e-juice or vape juice)"
],
"number_product_problems": 0
},
{
"date_submitted": "09/17/2019",
"nonuser_affected": "No",
"reported_health_problems": [
"Dyspnea"
],
"number_tobacco_products": 1,
"number_health_problems": 1,
"report_id": 1164,
"reported_product_problems": [
"No information provided"
],
"tobacco_products": [
"Electronic cigarette, electronic nicotine or vaping product (E-cigarette, e-cigars, e-hookahs, e-pipes, vape pens, hookah pens, and personal vaporizers; E-liquids, e-juice or vape juice)"
],
"number_product_problems": 0
},
{
"date_submitted": "08/09/2019",
"nonuser_affected": "No",
"reported_health_problems": [
"Seizure"
],
"number_tobacco_products": 1,
"number_health_problems": 1,
"report_id": 942,
"reported_product_problems": [
"No information provided"
],
"tobacco_products": [
"Electronic cigarette, electronic nicotine or vaping product (E-cigarette, e-cigars, e-hookahs, e-pipes, vape pens, hookah pens, and personal vaporizers; E-liquids, e-juice or vape juice)"
],
"number_product_problems": 0
},
{
"date_submitted": "08/30/2018",
"nonuser_affected": "No information provided",
"reported_health_problems": [
"Lung cancer"
],
"number_tobacco_products": 1,
"number_health_problems": 1,
"reported_product_problems": [
"No information provided"
],
"tobacco_products": [
"Cigarette"
],
"number_product_problems": 0
},
{
"date_submitted": "03/04/2021",
"nonuser_affected": "No",
"reported_health_problems": [
"Vision blurred",
"Nearsighted",
"Vomiting",
"Lung irritation",
"Myoclonus",
"Difficulty breathing",
"Defect coagulation (NOS)",
"Serotonin syndrome",
"Dilated pupils"
],
"number_tobacco_products": 1,
"number_health_problems": 9,
"reported_product_problems": [
"Foreign material (something in the product that does not belong)",
"Other"
],
"tobacco_products": [
"Electronic cigarette or vaping product (also known as E-cigarette, vape pen, hookah pen, mod, e-cigar, e-hookah, and e-pipe; E-liquid (also known as \"e-juice\" or \"vape juice\"))"
],
"number_product_problems": 2
},
{
"date_submitted": "09/18/2019",
"nonuser_affected": "No",
"reported_health_problems": [
"Other"
],
"number_tobacco_products": 1,
"number_health_problems": 1,
"report_id": 1172,
"reported_product_problems": [
"No information provided"
],
"tobacco_products": [
"Electronic cigarette, electronic nicotine or vaping product (E-cigarette, e-cigars, e-hookahs, e-pipes, vape pens, hookah pens, and personal vaporizers; E-liquids, e-juice or vape juice)"
],
"number_product_problems": 0
},
{
"date_submitted": "08/09/2019",
"nonuser_affected": "No",
"reported_health_problems": [
"Seizures",
"Motor vehicle accident"
],
"number_tobacco_products": 1,
"number_health_problems": 2,
"report_id": 943,
"reported_product_problems": [
"No information provided"
],
"tobacco_products": [
"Electronic cigarette, electronic nicotine or vaping product (E-cigarette, e-cigars, e-hookahs, e-pipes, vape pens, hookah pens, and personal vaporizers; E-liquids, e-juice or vape juice)"
],
"number_product_problems": 0
},
{
"date_submitted": "09/07/2018",
"nonuser_affected": "Yes",
"reported_health_problems": [
"Other"
],
"number_tobacco_products": 1,
"number_health_problems": 1,
"reported_product_problems": [
"No information provided"
],
"tobacco_products": [
"Electronic cigarette, electronic nicotine or vaping product (E-cigarette, e-cigars, e-hookahs, e-pipes, vape pens, hookah pens, and personal vaporizers; E-liquids, e-juice or vape juice)"
],
"number_product_problems": 0
},
{
"date_submitted": "02/05/2020",
"nonuser_affected": "Yes",
"reported_health_problems": [
"Deficiency mental"
],
"number_tobacco_products": 1,
"number_health_problems": 1,
"report_id": 2079873,
"reported_product_problems": [
"No information provided"
],
"tobacco_products": [
"Electronic cigarette, electronic nicotine or vaping product (E-cigarette, e-cigars, e-hookahs, e-pipes, vape pens, hookah pens, and personal vaporizers; E-liquids, e-juice or vape juice)"
],
"number_product_problems": 0
},
{
"date_submitted": "09/18/2019",
"nonuser_affected": "No",
"reported_health_problems": [
"Seizure",
"Nicotine poisoning"
],
"number_tobacco_products": 1,
"number_health_problems": 2,
"report_id": 1174,
"reported_product_problems": [
"Other"
],
"tobacco_products": [
"Electronic cigarette, electronic nicotine or vaping product (E-cigarette, e-cigars, e-hookahs, e-pipes, vape pens, hookah pens, and personal vaporizers; E-liquids, e-juice or vape juice)"
],
"number_product_problems": 1
}
]
}

1869
bench/fda/tobacco100.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,82 @@
{
"meta": {
"disclaimer": "Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service.",
"terms": "https://open.fda.gov/terms/",
"license": "https://open.fda.gov/license/",
"last_updated": "2021-04-30"
},
"results": [
{
"term": "Electronic cigarette, electronic nicotine or vaping product (E-cigarette, e-cigars, e-hookahs, e-pipes, vape pens, hookah pens, and personal vaporizers; E-liquids, e-juice or vape juice)",
"count": 810
},
{
"term": "Electronic cigarette or vaping product (also known as E-cigarette, vape pen, hookah pen, mod, e-cigar, e-hookah, and e-pipe; E-liquid (also known as \"e-juice\" or \"vape juice\"))",
"count": 77
},
{
"term": "Cigarette",
"count": 68
},
{
"term": "Other",
"count": 48
},
{
"term": "Snuff (dry or moist for use in nose or mouth)",
"count": 14
},
{
"term": "Roll-your-own cigarette",
"count": 10
},
{
"term": "Pipe or pipe tobacco",
"count": 8
},
{
"term": "Chewing tobacco (loose leaf chew, plug, twist/roll)",
"count": 6
},
{
"term": "Small Cigar, Little Cigar or Cigarillo",
"count": 4
},
{
"term": "Tobacco Heating System (heats tobacco leaf not liquid)",
"count": 4
},
{
"term": "Snus (pouches or loose)",
"count": 3
},
{
"term": "Cigar (large or premium)",
"count": 2
},
{
"term": "Heated Tobacco Product (also known as \"Heat not Burn\"; heats dry or moist tobacco)",
"count": 2
},
{
"term": "Waterpipe (also known as hookah, narghile, shisha, or goza)",
"count": 2
},
{
"term": "Dissolvable (for example, strips, sticks, orbs)",
"count": 1
},
{
"term": "Gutka (or Gutkha), Betel Quid with Tobacco",
"count": 1
},
{
"term": "Mixture of tobacco with spices, herbs, nuts, fruit, plant leaves, etc. (used for chewing)",
"count": 1
},
{
"term": "Nicotine Lotions or Gels (applied to the skin)",
"count": 1
}
]
}

56
bench/fda/waterpipe.json Normal file
View File

@ -0,0 +1,56 @@
{
"meta": {
"disclaimer": "Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service.",
"terms": "https://open.fda.gov/terms/",
"license": "https://open.fda.gov/license/",
"last_updated": "2021-04-30",
"results": {
"skip": 0,
"limit": 100,
"total": 2
}
},
"results": [
{
"date_submitted": "09/12/2019",
"nonuser_affected": "No",
"reported_health_problems": [
"No information provided"
],
"number_tobacco_products": 1,
"number_health_problems": 0,
"report_id": 1128,
"reported_product_problems": [
"Other",
"Damaged, broken, or defective product"
],
"tobacco_products": [
"Waterpipe (also known as hookah, narghile, shisha, or goza)"
],
"number_product_problems": 2
},
{
"date_submitted": "09/28/2017",
"nonuser_affected": "No",
"reported_health_problems": [
"Other",
"Acute migraine"
],
"number_tobacco_products": 3,
"number_health_problems": 2,
"reported_product_problems": [
"Damaged, broken or defective product, part, accessory, or package",
"Appearance, look, smell, or taste issue",
"Label or instruction issue",
"Other",
"Foreign material (something in the product that does not belong)"
],
"tobacco_products": [
"Waterpipe (also known as hookah, narghile, shisha, or goza)",
"Pipe or pipe tobacco",
"Electronic cigarette, electronic nicotine or vaping product (E-cigarette, e-cigars, e-hookahs, e-pipes, vape pens, hookah pens, and personal vaporizers; E-liquids, e-juice or vape juice)"
],
"number_product_problems": 5
}
]
}

29
bench/fixup_micro.sh Executable file
View File

@ -0,0 +1,29 @@
#!/bin/sh
# the log format for micro benchmark has a bunch of information nested in the filename
# here we break it apart so that we can generate appropriate charts
[ "$#" -eq 1 ] && [ -f "$1" ] || {
echo "Usage: $(basename $0) [BENCHMARK LOG]" >&2
echo >&2
echo " see run_bench.sh in the repo root" >&2
exit 2
}
group=$(mktemp)
name=$(mktemp)
info=$(mktemp)
rest=$(mktemp)
cat $1 | cut -f 1 -d ',' >$group
cat $1 | cut -f 2 -d ',' >$name
# take the filename and break it up; we need to emit a new header field, too
echo kind,direction,magnitude >$info
tail -n +2 $name | sed s/_/,/g | sed s/.json// >>$info
cat $1 | cut -f 3,4,5,6 -d ',' >$rest
paste -d ',' $group $name $info $rest
rm $group $name $info $rest

25
bench/generate_charts.R Executable file
View File

@ -0,0 +1,25 @@
#!/usr/bin/env Rscript
library(ggplot2)
args = commandArgs(trailingOnly=TRUE)
bench <- data.frame(read.csv(args[1]))
bench$activity <- factor(bench$activity, levels = c("reading", "loading", "saving", "writing"))
benchPlot <- ggplot(bench) +
xlab("File size (MiB)") + ylab("Time (ms, log10)") + scale_colour_discrete(name = "Activity") +
scale_x_continuous(limits=c(0,3100), breaks=c(0,1024,2048,3072), labels=c("0MiB","1MiB","2MiB","3MiB")) +
scale_y_continuous(breaks=c(0,2,4,6,8,10),labels=c("0ms", "0.01ms", "0.1ms", "1ms", "10ms", "100ms")) +
geom_point(aes(size/1024,log(ns,base=10),colour=activity))
ggsave(gsub("log","png",args[1]), benchPlot, width=4.5, height=4.5)
micro <- data.frame(read.csv(args[2]))
micro$activity <- factor(micro$activity, levels = c("reading", "loading", "saving", "writing"))
microPlot <- ggplot(micro) +
xlab("JSON value size") + ylab("Time (ms, log10)") + scale_colour_discrete(name = "Activity") + scale_shape_discrete(name = "Kind") +
scale_x_continuous(limits=c(0,8), breaks=c(0,2,4,6,8), labels=c("1", "4", "16", "64", "256")) +
scale_y_continuous(breaks=c(0,2,4,6,8,10),labels=c("0ms", "0.01ms", "0.1ms", "1ms", "10ms", "100ms")) +
geom_point(aes(log(magnitude,base=2),log(ns,base=10),colour=activity,shape=kind)) +
facet_wrap( ~ direction, labeller = as_labeller(c(`deep` = "Deep { { ... } }", `wide` = "Wide { ..., ... }")))
ggsave(gsub("log","png",args[2]), microPlot, width=4.5, height=4.5)

103
bench/gh/ffs.json Normal file
View File

@ -0,0 +1,103 @@
{
"id": 374712709,
"node_id": "MDEwOlJlcG9zaXRvcnkzNzQ3MTI3MDk=",
"name": "ffs",
"full_name": "mgree/ffs",
"private": false,
"owner": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"html_url": "https://github.com/mgree/ffs",
"description": "the file filesystem: mount semi-structured data (like JSON) as a Unix filesystem",
"fork": false,
"url": "https://api.github.com/repos/mgree/ffs",
"forks_url": "https://api.github.com/repos/mgree/ffs/forks",
"keys_url": "https://api.github.com/repos/mgree/ffs/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/mgree/ffs/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/mgree/ffs/teams",
"hooks_url": "https://api.github.com/repos/mgree/ffs/hooks",
"issue_events_url": "https://api.github.com/repos/mgree/ffs/issues/events{/number}",
"events_url": "https://api.github.com/repos/mgree/ffs/events",
"assignees_url": "https://api.github.com/repos/mgree/ffs/assignees{/user}",
"branches_url": "https://api.github.com/repos/mgree/ffs/branches{/branch}",
"tags_url": "https://api.github.com/repos/mgree/ffs/tags",
"blobs_url": "https://api.github.com/repos/mgree/ffs/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/mgree/ffs/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/mgree/ffs/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/mgree/ffs/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/mgree/ffs/statuses/{sha}",
"languages_url": "https://api.github.com/repos/mgree/ffs/languages",
"stargazers_url": "https://api.github.com/repos/mgree/ffs/stargazers",
"contributors_url": "https://api.github.com/repos/mgree/ffs/contributors",
"subscribers_url": "https://api.github.com/repos/mgree/ffs/subscribers",
"subscription_url": "https://api.github.com/repos/mgree/ffs/subscription",
"commits_url": "https://api.github.com/repos/mgree/ffs/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/mgree/ffs/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/mgree/ffs/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/mgree/ffs/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/mgree/ffs/contents/{+path}",
"compare_url": "https://api.github.com/repos/mgree/ffs/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/mgree/ffs/merges",
"archive_url": "https://api.github.com/repos/mgree/ffs/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/mgree/ffs/downloads",
"issues_url": "https://api.github.com/repos/mgree/ffs/issues{/number}",
"pulls_url": "https://api.github.com/repos/mgree/ffs/pulls{/number}",
"milestones_url": "https://api.github.com/repos/mgree/ffs/milestones{/number}",
"notifications_url": "https://api.github.com/repos/mgree/ffs/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/mgree/ffs/labels{/name}",
"releases_url": "https://api.github.com/repos/mgree/ffs/releases{/id}",
"deployments_url": "https://api.github.com/repos/mgree/ffs/deployments",
"created_at": "2021-06-07T15:22:28Z",
"updated_at": "2021-07-22T21:09:54Z",
"pushed_at": "2021-07-27T14:07:46Z",
"git_url": "git://github.com/mgree/ffs.git",
"ssh_url": "git@github.com:mgree/ffs.git",
"clone_url": "https://github.com/mgree/ffs.git",
"svn_url": "https://github.com/mgree/ffs",
"homepage": "https://mgree.github.io/ffs/",
"size": 1011,
"stargazers_count": 109,
"watchers_count": 109,
"language": "Rust",
"has_issues": true,
"has_projects": true,
"has_downloads": true,
"has_wiki": true,
"has_pages": true,
"forks_count": 3,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 15,
"license": {
"key": "gpl-3.0",
"name": "GNU General Public License v3.0",
"spdx_id": "GPL-3.0",
"url": "https://api.github.com/licenses/gpl-3.0",
"node_id": "MDc6TGljZW5zZTk="
},
"forks": 3,
"open_issues": 15,
"watchers": 109,
"default_branch": "main",
"temp_clone_token": null,
"network_count": 3,
"subscribers_count": 1
}

926
bench/gh/ffs_issues.json Normal file
View File

@ -0,0 +1,926 @@
[
{
"url": "https://api.github.com/repos/mgree/ffs/issues/37",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/37/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/37/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/37/events",
"html_url": "https://github.com/mgree/ffs/issues/37",
"id": 936563865,
"node_id": "MDU6SXNzdWU5MzY1NjM4NjU=",
"number": 37,
"title": "Debian package",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390728,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI4",
"url": "https://api.github.com/repos/mgree/ffs/labels/help%20wanted",
"name": "help wanted",
"color": "008672",
"default": true,
"description": "Extra attention is needed"
},
{
"id": 3141103140,
"node_id": "MDU6TGFiZWwzMTQxMTAzMTQw",
"url": "https://api.github.com/repos/mgree/ffs/labels/install",
"name": "install",
"color": "790BD4",
"default": false,
"description": ""
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-07-04T23:41:37Z",
"updated_at": "2021-07-04T23:45:07Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "Would be good to build a `.deb` file for this.\r\n\r\nhttps://github.com/mmstick/cargo-deb seems promising.",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/36",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/36/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/36/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/36/events",
"html_url": "https://github.com/mgree/ffs/issues/36",
"id": 936563859,
"node_id": "MDU6SXNzdWU5MzY1NjM4NTk=",
"number": 36,
"title": "homebrew package",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390728,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI4",
"url": "https://api.github.com/repos/mgree/ffs/labels/help%20wanted",
"name": "help wanted",
"color": "008672",
"default": true,
"description": "Extra attention is needed"
},
{
"id": 3141103140,
"node_id": "MDU6TGFiZWwzMTQxMTAzMTQw",
"url": "https://api.github.com/repos/mgree/ffs/labels/install",
"name": "install",
"color": "790BD4",
"default": false,
"description": ""
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-07-04T23:41:34Z",
"updated_at": "2021-07-04T23:43:47Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "Started working in https://github.com/mgree/ffs/tree/homebrew.\r\n\r\nReally, no idea what I'm doing. Not sure how to depend on a cask (macfuse) and I have the sinking feeling that you can't. Oy.",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/28",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/28/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/28/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/28/events",
"html_url": "https://github.com/mgree/ffs/issues/28",
"id": 932778160,
"node_id": "MDU6SXNzdWU5MzI3NzgxNjA=",
"number": 28,
"title": "PDF (?!)",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390726,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI2",
"url": "https://api.github.com/repos/mgree/ffs/labels/enhancement",
"name": "enhancement",
"color": "a2eeef",
"default": true,
"description": "New feature or request"
},
{
"id": 3126904200,
"node_id": "MDU6TGFiZWwzMTI2OTA0MjAw",
"url": "https://api.github.com/repos/mgree/ffs/labels/format",
"name": "format",
"color": "44EE79",
"default": false,
"description": ""
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-06-29T14:46:21Z",
"updated_at": "2021-06-29T14:46:21Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "Request: https://twitter.com/wtfpdf/status/1409883313888804868\r\n\r\nPromising lead on a Rust library: https://github.com/J-F-Liu/lopdf with [Document::load](https://docs.rs/lopdf/0.26.0/lopdf/struct.Document.html#method.load) and [Document.*](https://docs.rs/lopdf/0.26.0/lopdf/struct.Document.html#fields)",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/23",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/23/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/23/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/23/events",
"html_url": "https://github.com/mgree/ffs/issues/23",
"id": 929208382,
"node_id": "MDU6SXNzdWU5MjkyMDgzODI=",
"number": 23,
"title": "Sync/live flags",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390726,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI2",
"url": "https://api.github.com/repos/mgree/ffs/labels/enhancement",
"name": "enhancement",
"color": "a2eeef",
"default": true,
"description": "New feature or request"
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-06-24T13:04:05Z",
"updated_at": "2021-06-24T13:04:05Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "A `--live` flag to sync the JSON out on every write.\r\n\r\nA `--watch` flag to notice updates to the JSON file and rebuild the FS.\r\n\r\nWith lazy/incremental, this would be complicated.",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/21",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/21/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/21/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/21/events",
"html_url": "https://github.com/mgree/ffs/issues/21",
"id": 928742395,
"node_id": "MDU6SXNzdWU5Mjg3NDIzOTU=",
"number": 21,
"title": "Support `copy_file_range`",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390726,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI2",
"url": "https://api.github.com/repos/mgree/ffs/labels/enhancement",
"name": "enhancement",
"color": "a2eeef",
"default": true,
"description": "New feature or request"
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-06-24T00:29:41Z",
"updated_at": "2021-07-03T22:22:01Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": null,
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/20",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/20/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/20/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/20/events",
"html_url": "https://github.com/mgree/ffs/issues/20",
"id": 928568009,
"node_id": "MDU6SXNzdWU5Mjg1NjgwMDk=",
"number": 20,
"title": "Alternative models",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3095291610,
"node_id": "MDU6TGFiZWwzMDk1MjkxNjEw",
"url": "https://api.github.com/repos/mgree/ffs/labels/research",
"name": "research",
"color": "6B832F",
"default": false,
"description": ""
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-06-23T19:21:20Z",
"updated_at": "2021-07-04T23:47:01Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "Lazy loading (scan but don't parse into structures until demanded).\r\n\r\nAhead-of-time mappings (literally build/unbuild FS).\r\n\r\nUse 9p, per [Jay McCarthy](http://www.weaselhat.com/2021/06/29/processing-semi-structured-data-in-the-unix-shell/#comment-187595). Or use the Bento FS thing?",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/19",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/19/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/19/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/19/events",
"html_url": "https://github.com/mgree/ffs/issues/19",
"id": 928565560,
"node_id": "MDU6SXNzdWU5Mjg1NjU1NjA=",
"number": 19,
"title": "Reconsider mount options",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390726,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI2",
"url": "https://api.github.com/repos/mgree/ffs/labels/enhancement",
"name": "enhancement",
"color": "a2eeef",
"default": true,
"description": "New feature or request"
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-06-23T19:17:48Z",
"updated_at": "2021-06-24T14:14:59Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "There are plenty of interesting options on https://man7.org/linux/man-pages/man8/mount.fuse3.8.html.\r\n\r\n- default_permissions\r\n- allow_other\r\n- ~~auto_unmount always on?~~ a02d674\r\n- kernel_cache",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/16",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/16/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/16/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/16/events",
"html_url": "https://github.com/mgree/ffs/issues/16",
"id": 926721477,
"node_id": "MDU6SXNzdWU5MjY3MjE0Nzc=",
"number": 16,
"title": "Speculative format detection",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390726,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI2",
"url": "https://api.github.com/repos/mgree/ffs/labels/enhancement",
"name": "enhancement",
"color": "a2eeef",
"default": true,
"description": "New feature or request"
},
{
"id": 3126904200,
"node_id": "MDU6TGFiZWwzMTI2OTA0MjAw",
"url": "https://api.github.com/repos/mgree/ffs/labels/format",
"name": "format",
"color": "44EE79",
"default": false,
"description": ""
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-06-22T00:45:53Z",
"updated_at": "2021-06-29T14:46:54Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "Use a short buffer and some heuristic ([xdg-mime](https://crates.io/crates/xdg-mime) or [infer](https://crates.io/crates/infer), but really probably custom heuristics) to detect file types.",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/15",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/15/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/15/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/15/events",
"html_url": "https://github.com/mgree/ffs/issues/15",
"id": 926720138,
"node_id": "MDU6SXNzdWU5MjY3MjAxMzg=",
"number": 15,
"title": "Support XML",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390726,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI2",
"url": "https://api.github.com/repos/mgree/ffs/labels/enhancement",
"name": "enhancement",
"color": "a2eeef",
"default": true,
"description": "New feature or request"
},
{
"id": 3126904200,
"node_id": "MDU6TGFiZWwzMTI2OTA0MjAw",
"url": "https://api.github.com/repos/mgree/ffs/labels/format",
"name": "format",
"color": "44EE79",
"default": false,
"description": ""
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-06-22T00:41:34Z",
"updated_at": "2021-06-29T14:46:36Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "Depends on #2 in part.",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/13",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/13/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/13/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/13/events",
"html_url": "https://github.com/mgree/ffs/issues/13",
"id": 926529509,
"node_id": "MDU6SXNzdWU5MjY1Mjk1MDk=",
"number": 13,
"title": "GC `unlink`ed/`rmdir`ed inodes",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390726,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI2",
"url": "https://api.github.com/repos/mgree/ffs/labels/enhancement",
"name": "enhancement",
"color": "a2eeef",
"default": true,
"description": "New feature or request"
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-06-21T19:34:45Z",
"updated_at": "2021-06-23T12:52:00Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "Keep a free list, and reuse inode numbers.",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/10",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/10/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/10/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/10/events",
"html_url": "https://github.com/mgree/ffs/issues/10",
"id": 925383896,
"node_id": "MDU6SXNzdWU5MjUzODM4OTY=",
"number": 10,
"title": "Use `Filesystem::destroy` instead of `Drop::drop`",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390726,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI2",
"url": "https://api.github.com/repos/mgree/ffs/labels/enhancement",
"name": "enhancement",
"color": "a2eeef",
"default": true,
"description": "New feature or request"
},
{
"id": 3106124865,
"node_id": "MDU6TGFiZWwzMTA2MTI0ODY1",
"url": "https://api.github.com/repos/mgree/ffs/labels/upstream",
"name": "upstream",
"color": "28A5CF",
"default": false,
"description": ""
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 1,
"created_at": "2021-06-19T12:23:52Z",
"updated_at": "2021-06-22T00:47:26Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "Per https://github.com/cberner/fuser/issues/153#issuecomment-864348771, better to rely on the explicit contract than on the the current implementation in fuser calling `mem::drop`.",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/9",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/9/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/9/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/9/events",
"html_url": "https://github.com/mgree/ffs/issues/9",
"id": 924150016,
"node_id": "MDU6SXNzdWU5MjQxNTAwMTY=",
"number": 9,
"title": "Performance benchmarking",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3095291610,
"node_id": "MDU6TGFiZWwzMDk1MjkxNjEw",
"url": "https://api.github.com/repos/mgree/ffs/labels/research",
"name": "research",
"color": "6B832F",
"default": false,
"description": ""
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 1,
"created_at": "2021-06-17T16:58:38Z",
"updated_at": "2021-07-03T15:01:23Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "Timing: use https://crates.io/crates/tracing-timing?\r\n\r\nMicrobenchmarks\r\n\r\n- read\r\n- write\r\n\r\nMacrobenchmarks\r\n\r\n- tasks?\r\n\r\nCompare against\r\n\r\n- FS (various hdd configs) as baseline\r\n- ramdisk as memory FS baseline\r\n- jq\r\n- js\r\n- python\r\n- native rust",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/7",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/7/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/7/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/7/events",
"html_url": "https://github.com/mgree/ffs/issues/7",
"id": 921731087,
"node_id": "MDU6SXNzdWU5MjE3MzEwODc=",
"number": 7,
"title": "Missing tests",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390726,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI2",
"url": "https://api.github.com/repos/mgree/ffs/labels/enhancement",
"name": "enhancement",
"color": "a2eeef",
"default": true,
"description": "New feature or request"
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-06-15T19:34:07Z",
"updated_at": "2021-06-22T01:10:13Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "+ [ ] `access`, `fallocate`\r\n+ [ ] multi-user stuff\r\n+ [ ] error code coverage\r\n+ [x] ~~TOML~~ 476f3a1 and 8cac6d2\r\n+ [x] ~~run testing in parallel~~ 2ec8fa6",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/2",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/2/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/2/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/2/events",
"html_url": "https://github.com/mgree/ffs/issues/2",
"id": 921729354,
"node_id": "MDU6SXNzdWU5MjE3MjkzNTQ=",
"number": 2,
"title": "Metadata support",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390726,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzI2",
"url": "https://api.github.com/repos/mgree/ffs/labels/enhancement",
"name": "enhancement",
"color": "a2eeef",
"default": true,
"description": "New feature or request"
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 2,
"created_at": "2021-06-15T19:31:44Z",
"updated_at": "2021-07-02T00:20:01Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "+ [ ] Options for naming of ListDirectory elements (prefix/suffix? format string?)\r\n+ [ ] Metadata\r\n - [ ] extensions\r\n - [ ] dotfiles\r\n - [x] ~~xattrs~~ in #30\r\n",
"performed_via_github_app": null
},
{
"url": "https://api.github.com/repos/mgree/ffs/issues/1",
"repository_url": "https://api.github.com/repos/mgree/ffs",
"labels_url": "https://api.github.com/repos/mgree/ffs/issues/1/labels{/name}",
"comments_url": "https://api.github.com/repos/mgree/ffs/issues/1/comments",
"events_url": "https://api.github.com/repos/mgree/ffs/issues/1/events",
"html_url": "https://github.com/mgree/ffs/issues/1",
"id": 920859719,
"node_id": "MDU6SXNzdWU5MjA4NTk3MTk=",
"number": 1,
"title": "Invalid unmount on macOS",
"user": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"labels": [
{
"id": 3066390720,
"node_id": "MDU6TGFiZWwzMDY2MzkwNzIw",
"url": "https://api.github.com/repos/mgree/ffs/labels/bug",
"name": "bug",
"color": "d73a4a",
"default": true,
"description": "Something isn't working"
}
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2021-06-14T23:51:13Z",
"updated_at": "2021-06-15T19:30:59Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": "Investigate weird unmounts on macOS, producing:\r\n\r\n```\r\nWARN fuser::mnt::fuse2: umount failed with Os { code: 22, kind: InvalidInput, message: \"Invalid argument\" }\r\n```\r\n\r\nSee [actions log](https://github.com/mgree/ffs/runs/2821652281?check_suite_focus=true#step:5:88). Linux seems fine.",
"performed_via_github_app": null
}
]

28
bench/gh/gh_apache2.json Normal file

File diff suppressed because one or more lines are too long

1876
bench/gh/gh_emoji.json Normal file

File diff suppressed because it is too large Load Diff

1410
bench/gh/gh_events.json Normal file

File diff suppressed because one or more lines are too long

29
bench/gh/gh_gpl3.json Normal file

File diff suppressed because one or more lines are too long

93
bench/gh/gh_licenses.json Normal file
View File

@ -0,0 +1,93 @@
[
{
"key": "agpl-3.0",
"name": "GNU Affero General Public License v3.0",
"spdx_id": "AGPL-3.0",
"url": "https://api.github.com/licenses/agpl-3.0",
"node_id": "MDc6TGljZW5zZTE="
},
{
"key": "apache-2.0",
"name": "Apache License 2.0",
"spdx_id": "Apache-2.0",
"url": "https://api.github.com/licenses/apache-2.0",
"node_id": "MDc6TGljZW5zZTI="
},
{
"key": "bsd-2-clause",
"name": "BSD 2-Clause \"Simplified\" License",
"spdx_id": "BSD-2-Clause",
"url": "https://api.github.com/licenses/bsd-2-clause",
"node_id": "MDc6TGljZW5zZTQ="
},
{
"key": "bsd-3-clause",
"name": "BSD 3-Clause \"New\" or \"Revised\" License",
"spdx_id": "BSD-3-Clause",
"url": "https://api.github.com/licenses/bsd-3-clause",
"node_id": "MDc6TGljZW5zZTU="
},
{
"key": "bsl-1.0",
"name": "Boost Software License 1.0",
"spdx_id": "BSL-1.0",
"url": "https://api.github.com/licenses/bsl-1.0",
"node_id": "MDc6TGljZW5zZTI4"
},
{
"key": "cc0-1.0",
"name": "Creative Commons Zero v1.0 Universal",
"spdx_id": "CC0-1.0",
"url": "https://api.github.com/licenses/cc0-1.0",
"node_id": "MDc6TGljZW5zZTY="
},
{
"key": "epl-2.0",
"name": "Eclipse Public License 2.0",
"spdx_id": "EPL-2.0",
"url": "https://api.github.com/licenses/epl-2.0",
"node_id": "MDc6TGljZW5zZTMy"
},
{
"key": "gpl-2.0",
"name": "GNU General Public License v2.0",
"spdx_id": "GPL-2.0",
"url": "https://api.github.com/licenses/gpl-2.0",
"node_id": "MDc6TGljZW5zZTg="
},
{
"key": "gpl-3.0",
"name": "GNU General Public License v3.0",
"spdx_id": "GPL-3.0",
"url": "https://api.github.com/licenses/gpl-3.0",
"node_id": "MDc6TGljZW5zZTk="
},
{
"key": "lgpl-2.1",
"name": "GNU Lesser General Public License v2.1",
"spdx_id": "LGPL-2.1",
"url": "https://api.github.com/licenses/lgpl-2.1",
"node_id": "MDc6TGljZW5zZTEx"
},
{
"key": "mit",
"name": "MIT License",
"spdx_id": "MIT",
"url": "https://api.github.com/licenses/mit",
"node_id": "MDc6TGljZW5zZTEz"
},
{
"key": "mpl-2.0",
"name": "Mozilla Public License 2.0",
"spdx_id": "MPL-2.0",
"url": "https://api.github.com/licenses/mpl-2.0",
"node_id": "MDc6TGljZW5zZTE0"
},
{
"key": "unlicense",
"name": "The Unlicense",
"spdx_id": "Unlicense",
"url": "https://api.github.com/licenses/unlicense",
"node_id": "MDc6TGljZW5zZTE1"
}
]

File diff suppressed because it is too large Load Diff

103
bench/gh/kmt.json Normal file
View File

@ -0,0 +1,103 @@
{
"id": 149648258,
"node_id": "MDEwOlJlcG9zaXRvcnkxNDk2NDgyNTg=",
"name": "kmt",
"full_name": "mgree/kmt",
"private": false,
"owner": {
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false
},
"html_url": "https://github.com/mgree/kmt",
"description": "Kleene algebra modulo theories",
"fork": false,
"url": "https://api.github.com/repos/mgree/kmt",
"forks_url": "https://api.github.com/repos/mgree/kmt/forks",
"keys_url": "https://api.github.com/repos/mgree/kmt/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/mgree/kmt/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/mgree/kmt/teams",
"hooks_url": "https://api.github.com/repos/mgree/kmt/hooks",
"issue_events_url": "https://api.github.com/repos/mgree/kmt/issues/events{/number}",
"events_url": "https://api.github.com/repos/mgree/kmt/events",
"assignees_url": "https://api.github.com/repos/mgree/kmt/assignees{/user}",
"branches_url": "https://api.github.com/repos/mgree/kmt/branches{/branch}",
"tags_url": "https://api.github.com/repos/mgree/kmt/tags",
"blobs_url": "https://api.github.com/repos/mgree/kmt/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/mgree/kmt/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/mgree/kmt/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/mgree/kmt/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/mgree/kmt/statuses/{sha}",
"languages_url": "https://api.github.com/repos/mgree/kmt/languages",
"stargazers_url": "https://api.github.com/repos/mgree/kmt/stargazers",
"contributors_url": "https://api.github.com/repos/mgree/kmt/contributors",
"subscribers_url": "https://api.github.com/repos/mgree/kmt/subscribers",
"subscription_url": "https://api.github.com/repos/mgree/kmt/subscription",
"commits_url": "https://api.github.com/repos/mgree/kmt/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/mgree/kmt/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/mgree/kmt/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/mgree/kmt/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/mgree/kmt/contents/{+path}",
"compare_url": "https://api.github.com/repos/mgree/kmt/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/mgree/kmt/merges",
"archive_url": "https://api.github.com/repos/mgree/kmt/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/mgree/kmt/downloads",
"issues_url": "https://api.github.com/repos/mgree/kmt/issues{/number}",
"pulls_url": "https://api.github.com/repos/mgree/kmt/pulls{/number}",
"milestones_url": "https://api.github.com/repos/mgree/kmt/milestones{/number}",
"notifications_url": "https://api.github.com/repos/mgree/kmt/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/mgree/kmt/labels{/name}",
"releases_url": "https://api.github.com/repos/mgree/kmt/releases{/id}",
"deployments_url": "https://api.github.com/repos/mgree/kmt/deployments",
"created_at": "2018-09-20T17:48:53Z",
"updated_at": "2021-07-22T08:12:29Z",
"pushed_at": "2020-04-06T18:19:54Z",
"git_url": "git://github.com/mgree/kmt.git",
"ssh_url": "git@github.com:mgree/kmt.git",
"clone_url": "https://github.com/mgree/kmt.git",
"svn_url": "https://github.com/mgree/kmt",
"homepage": null,
"size": 207,
"stargazers_count": 15,
"watchers_count": 15,
"language": "OCaml",
"has_issues": true,
"has_projects": true,
"has_downloads": true,
"has_wiki": true,
"has_pages": false,
"forks_count": 1,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 0,
"license": {
"key": "mit",
"name": "MIT License",
"spdx_id": "MIT",
"url": "https://api.github.com/licenses/mit",
"node_id": "MDc6TGljZW5zZTEz"
},
"forks": 1,
"open_issues": 0,
"watchers": 15,
"default_branch": "master",
"temp_clone_token": null,
"network_count": 1,
"subscribers_count": 2
}

34
bench/gh/mgree.json Normal file
View File

@ -0,0 +1,34 @@
{
"login": "mgree",
"id": 505088,
"node_id": "MDQ6VXNlcjUwNTA4OA==",
"avatar_url": "https://avatars.githubusercontent.com/u/505088?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/mgree",
"html_url": "https://github.com/mgree",
"followers_url": "https://api.github.com/users/mgree/followers",
"following_url": "https://api.github.com/users/mgree/following{/other_user}",
"gists_url": "https://api.github.com/users/mgree/gists{/gist_id}",
"starred_url": "https://api.github.com/users/mgree/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/mgree/subscriptions",
"organizations_url": "https://api.github.com/users/mgree/orgs",
"repos_url": "https://api.github.com/users/mgree/repos",
"events_url": "https://api.github.com/users/mgree/events{/privacy}",
"received_events_url": "https://api.github.com/users/mgree/received_events",
"type": "User",
"site_admin": false,
"name": "Michael Greenberg",
"company": "Stevens Institute of Technology",
"blog": "https://mgree.github.io",
"location": "Hoboken, NJ",
"email": null,
"hireable": null,
"bio": null,
"twitter_username": "mgrnbrg",
"public_repos": 52,
"public_gists": 0,
"followers": 38,
"following": 7,
"created_at": "2010-12-01T15:00:44Z",
"updated_at": "2021-07-22T14:27:18Z"
}

2930
bench/gh/mgree_repos.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,22 @@
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}

View File

@ -0,0 +1,11 @@
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}

View File

@ -0,0 +1,26 @@
{"widget": {
"debug": "on",
"window": {
"title": "Sample Konfabulator Widget",
"name": "main_window",
"width": 500,
"height": 500
},
"image": {
"src": "Images/Sun.png",
"name": "sun1",
"hOffset": 250,
"vOffset": 250,
"alignment": "center"
},
"text": {
"data": "Click Here",
"size": 36,
"style": "bold",
"name": "text1",
"hOffset": 250,
"vOffset": 100,
"alignment": "center",
"onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
}
}}

View File

@ -0,0 +1,88 @@
{"web-app": {
"servlet": [
{
"servlet-name": "cofaxCDS",
"servlet-class": "org.cofax.cds.CDSServlet",
"init-param": {
"configGlossary:installationAt": "Philadelphia, PA",
"configGlossary:adminEmail": "ksm@pobox.com",
"configGlossary:poweredBy": "Cofax",
"configGlossary:poweredByIcon": "/images/cofax.gif",
"configGlossary:staticPath": "/content/static",
"templateProcessorClass": "org.cofax.WysiwygTemplate",
"templateLoaderClass": "org.cofax.FilesTemplateLoader",
"templatePath": "templates",
"templateOverridePath": "",
"defaultListTemplate": "listTemplate.htm",
"defaultFileTemplate": "articleTemplate.htm",
"useJSP": false,
"jspListTemplate": "listTemplate.jsp",
"jspFileTemplate": "articleTemplate.jsp",
"cachePackageTagsTrack": 200,
"cachePackageTagsStore": 200,
"cachePackageTagsRefresh": 60,
"cacheTemplatesTrack": 100,
"cacheTemplatesStore": 50,
"cacheTemplatesRefresh": 15,
"cachePagesTrack": 200,
"cachePagesStore": 100,
"cachePagesRefresh": 10,
"cachePagesDirtyRead": 10,
"searchEngineListTemplate": "forSearchEnginesList.htm",
"searchEngineFileTemplate": "forSearchEngines.htm",
"searchEngineRobotsDb": "WEB-INF/robots.db",
"useDataStore": true,
"dataStoreClass": "org.cofax.SqlDataStore",
"redirectionClass": "org.cofax.SqlRedirection",
"dataStoreName": "cofax",
"dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver",
"dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon",
"dataStoreUser": "sa",
"dataStorePassword": "dataStoreTestQuery",
"dataStoreTestQuery": "SET NOCOUNT ON;select test='test';",
"dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log",
"dataStoreInitConns": 10,
"dataStoreMaxConns": 100,
"dataStoreConnUsageLimit": 100,
"dataStoreLogLevel": "debug",
"maxUrlLength": 500}},
{
"servlet-name": "cofaxEmail",
"servlet-class": "org.cofax.cds.EmailServlet",
"init-param": {
"mailHost": "mail1",
"mailHostOverride": "mail2"}},
{
"servlet-name": "cofaxAdmin",
"servlet-class": "org.cofax.cds.AdminServlet"},
{
"servlet-name": "fileServlet",
"servlet-class": "org.cofax.cds.FileServlet"},
{
"servlet-name": "cofaxTools",
"servlet-class": "org.cofax.cms.CofaxToolsServlet",
"init-param": {
"templatePath": "toolstemplates/",
"log": 1,
"logLocation": "/usr/local/tomcat/logs/CofaxTools.log",
"logMaxSize": "",
"dataLog": 1,
"dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",
"dataLogMaxSize": "",
"removePageCache": "/content/admin/remove?cache=pages&id=",
"removeTemplateCache": "/content/admin/remove?cache=templates&id=",
"fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder",
"lookInContext": 1,
"adminGroupID": 4,
"betaServer": true}}],
"servlet-mapping": {
"cofaxCDS": "/",
"cofaxEmail": "/cofaxutil/aemail/*",
"cofaxAdmin": "/admin/*",
"fileServlet": "/static/*",
"cofaxTools": "/tools/*"},
"taglib": {
"taglib-uri": "cofax.tld",
"taglib-location": "/WEB-INF/tlds/cofax.tld"}}}

View File

@ -0,0 +1,27 @@
{"menu": {
"header": "SVG Viewer",
"items": [
{"id": "Open"},
{"id": "OpenNew", "label": "Open New"},
null,
{"id": "ZoomIn", "label": "Zoom In"},
{"id": "ZoomOut", "label": "Zoom Out"},
{"id": "OriginalView", "label": "Original View"},
null,
{"id": "Quality"},
{"id": "Pause"},
{"id": "Mute"},
null,
{"id": "Find", "label": "Find..."},
{"id": "FindAgain", "label": "Find Again"},
{"id": "Copy"},
{"id": "CopyAgain", "label": "Copy Again"},
{"id": "CopySVG", "label": "Copy SVG"},
{"id": "ViewSVG", "label": "View SVG"},
{"id": "ViewSource", "label": "View Source"},
{"id": "SaveAs", "label": "Save As"},
null,
{"id": "Help"},
{"id": "About", "label": "About Adobe CVG Viewer..."}
]
}}

25
bench/mk_micro.sh Executable file
View File

@ -0,0 +1,25 @@
#!/bin/sh
[ -d micro ] && rm -r micro
mkdir micro
for size in 1 2 4 8 16 32 64 128 256
do
for approach in deep wide
do
# if [ "$approach" = "deep" ] && [ "$size" -ge 128 ]
# then
# continue
# fi
for kind in list named
do
file="micro/${kind}_${approach}_${size}.json"
../utils/synth_json $kind $approach $size >$file 2>/dev/null
if [ $? -ne 0 ] || ! [ -s $file ]
then
echo "Couldn't build $file."
rm $file
fi
done
done
done

View File

@ -0,0 +1 @@
{"mindate":"1995-04-26","maxdate":"2021-07-25","name":"Hoboken, NJ 07030","datacoverage":0.95,"id":"ZIP:07030"}

View File

@ -0,0 +1 @@
{"metadata":{"resultset":{"offset":1,"count":7,"limit":25}},"results":[{"elevation":519.2,"mindate":"1995-05-09","maxdate":"2021-07-25","latitude":42.199694,"name":"BINGHAMTON, NY US","datacoverage":0.95,"id":"NEXRAD:KBGM","elevationUnit":"METERS","longitude":-75.984722},{"elevation":70.1,"mindate":"1995-04-26","maxdate":"2021-07-25","latitude":39.947089,"name":"PHILADELPHIA, NJ US","datacoverage":0.95,"id":"NEXRAD:KDIX","elevationUnit":"METERS","longitude":-74.410731},{"elevation":589.7,"mindate":"1995-05-09","maxdate":"2021-07-25","latitude":42.586556,"name":"ALBANY, NY US","datacoverage":0.95,"id":"NEXRAD:KENX","elevationUnit":"METERS","longitude":-74.064083},{"elevation":60.6,"mindate":"1995-04-27","maxdate":"2021-07-25","latitude":40.865528,"name":"NEW YORK CITY, NY US","datacoverage":0.95,"id":"NEXRAD:KOKX","elevationUnit":"METERS","longitude":-72.863917},{"elevation":41.1,"mindate":"2008-12-09","maxdate":"2021-07-25","latitude":40.593056,"name":"NEWARK, NJ US","datacoverage":0.95,"id":"NEXRAD:TEWR","elevationUnit":"METERS","longitude":-74.27},{"elevation":34.1,"mindate":"2009-02-19","maxdate":"2021-07-25","latitude":40.588889,"name":"NEW YORK CITY JFK, NY US","datacoverage":0.95,"id":"NEXRAD:TJFK","elevationUnit":"METERS","longitude":-73.881111},{"elevation":46.9,"mindate":"2009-03-25","maxdate":"2021-07-25","latitude":39.948889,"name":"PHILADELPHIA, NJ US","datacoverage":0.95,"id":"NEXRAD:TPHL","elevationUnit":"METERS","longitude":-75.068889}]}

View File

@ -0,0 +1 @@
{"metadata":{"resultset":{"offset":1,"count":42,"limit":25}},"results":[{"name":"Annual Agricultural","id":"ANNAGR"},{"name":"Annual Degree Days","id":"ANNDD"},{"name":"Annual Precipitation","id":"ANNPRCP"},{"name":"Annual Temperature","id":"ANNTEMP"},{"name":"Autumn Agricultural","id":"AUAGR"},{"name":"Autumn Degree Days","id":"AUDD"},{"name":"Autumn Precipitation","id":"AUPRCP"},{"name":"Autumn Temperature","id":"AUTEMP"},{"name":"Computed","id":"COMP"},{"name":"Computed Agricultural","id":"COMPAGR"},{"name":"Degree Days","id":"DD"},{"name":"Dual-Pol Moments","id":"DUALPOLMOMENT"},{"name":"Echo Tops","id":"ECHOTOP"},{"name":"Evaporation","id":"EVAP"},{"name":"Hydrometeor Type","id":"HYDROMETEOR"},{"name":"Land","id":"LAND"},{"name":"Miscellany","id":"MISC"},{"name":"Other","id":"OTHER"},{"name":"Overlay","id":"OVERLAY"},{"name":"Precipitation","id":"PRCP"},{"name":"Pressure","id":"PRES"},{"name":"Reflectivity","id":"REFLECTIVITY"},{"name":"Sky cover & clouds","id":"SKY"},{"name":"Spring Agricultural","id":"SPAGR"},{"name":"Spring Degree Days","id":"SPDD"}]}

View File

@ -0,0 +1 @@
{"metadata":{"resultset":{"offset":1,"count":11,"limit":25}},"results":[{"uid":"gov.noaa.ncdc:C00861","mindate":"1763-01-01","maxdate":"2021-07-25","name":"Daily Summaries","datacoverage":1,"id":"GHCND"},{"uid":"gov.noaa.ncdc:C00946","mindate":"1763-01-01","maxdate":"2021-07-01","name":"Global Summary of the Month","datacoverage":1,"id":"GSOM"},{"uid":"gov.noaa.ncdc:C00947","mindate":"1763-01-01","maxdate":"2021-01-01","name":"Global Summary of the Year","datacoverage":1,"id":"GSOY"},{"uid":"gov.noaa.ncdc:C00345","mindate":"1991-06-05","maxdate":"2021-07-25","name":"Weather Radar (Level II)","datacoverage":0.95,"id":"NEXRAD2"},{"uid":"gov.noaa.ncdc:C00708","mindate":"1994-05-20","maxdate":"2021-07-24","name":"Weather Radar (Level III)","datacoverage":0.95,"id":"NEXRAD3"},{"uid":"gov.noaa.ncdc:C00821","mindate":"2010-01-01","maxdate":"2010-01-01","name":"Normals Annual/Seasonal","datacoverage":1,"id":"NORMAL_ANN"},{"uid":"gov.noaa.ncdc:C00823","mindate":"2010-01-01","maxdate":"2010-12-31","name":"Normals Daily","datacoverage":1,"id":"NORMAL_DLY"},{"uid":"gov.noaa.ncdc:C00824","mindate":"2010-01-01","maxdate":"2010-12-31","name":"Normals Hourly","datacoverage":1,"id":"NORMAL_HLY"},{"uid":"gov.noaa.ncdc:C00822","mindate":"2010-01-01","maxdate":"2010-12-01","name":"Normals Monthly","datacoverage":1,"id":"NORMAL_MLY"},{"uid":"gov.noaa.ncdc:C00505","mindate":"1970-05-12","maxdate":"2014-01-01","name":"Precipitation 15 Minute","datacoverage":0.25,"id":"PRECIP_15"},{"uid":"gov.noaa.ncdc:C00313","mindate":"1900-01-01","maxdate":"2014-01-01","name":"Precipitation Hourly","datacoverage":1,"id":"PRECIP_HLY"}]}

View File

@ -0,0 +1 @@
{"metadata":{"resultset":{"offset":1,"count":1565,"limit":25}},"results":[{"mindate":"1994-03-19","maxdate":"1996-05-28","name":"Average cloudiness midnight to midnight from 30-second ceilometer data","datacoverage":1,"id":"ACMC"},{"mindate":"1965-01-01","maxdate":"2005-12-31","name":"Average cloudiness midnight to midnight from manual observations","datacoverage":1,"id":"ACMH"},{"mindate":"1994-02-01","maxdate":"1996-05-28","name":"Average cloudiness sunrise to sunset from 30-second ceilometer data","datacoverage":1,"id":"ACSC"},{"mindate":"1965-01-01","maxdate":"2005-12-31","name":"Average cloudiness sunrise to sunset from manual observations","datacoverage":1,"id":"ACSH"},{"mindate":"1991-06-05","maxdate":"2021-07-25","name":"Base Data","datacoverage":0.95,"id":"ALL"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual cooling degree days with base 45F","datacoverage":1,"id":"ANN-CLDD-BASE45"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual cooling degree days with base 50F","datacoverage":1,"id":"ANN-CLDD-BASE50"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual cooling degree days with base 55F","datacoverage":1,"id":"ANN-CLDD-BASE55"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual cooling degree days with base 57F","datacoverage":1,"id":"ANN-CLDD-BASE57"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual cooling degree days with base 60F","datacoverage":1,"id":"ANN-CLDD-BASE60"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual cooling degree days with base 70F","datacoverage":1,"id":"ANN-CLDD-BASE70"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual cooling degree days with base 72F","datacoverage":1,"id":"ANN-CLDD-BASE72"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual cooling degree days with base 65F","datacoverage":1,"id":"ANN-CLDD-NORMAL"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual diurnal temperature range","datacoverage":1,"id":"ANN-DUTR-NORMAL"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual growing degree days with base 40F","datacoverage":1,"id":"ANN-GRDD-BASE40"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual growing degree days with base 45F","datacoverage":1,"id":"ANN-GRDD-BASE45"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual growing degree days with base 50F","datacoverage":1,"id":"ANN-GRDD-BASE50"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual growing degree days with base 55F","datacoverage":1,"id":"ANN-GRDD-BASE55"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual growing degree days with base 57F","datacoverage":1,"id":"ANN-GRDD-BASE57"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual growing degree days with base 60F","datacoverage":1,"id":"ANN-GRDD-BASE60"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual growing degree days with base 65F","datacoverage":1,"id":"ANN-GRDD-BASE65"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual growing degree days with base 70F","datacoverage":1,"id":"ANN-GRDD-BASE70"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual growing degree days with base 72F","datacoverage":1,"id":"ANN-GRDD-BASE72"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual growing degree days with truncated bases 48F and 86F","datacoverage":1,"id":"ANN-GRDD-TB4886"},{"mindate":"2010-01-01","maxdate":"2010-01-01","name":"Long-term averages of annual growing degree days with truncated bases 50F and 86F","datacoverage":1,"id":"ANN-GRDD-TB5086"}]}

View File

@ -0,0 +1 @@
{"elevation":41.1,"mindate":"2008-12-09","maxdate":"2021-07-25","latitude":40.593056,"name":"NEWARK, NJ US","datacoverage":0.95,"id":"NEXRAD:TEWR","elevationUnit":"METERS","longitude":-74.27}

View File

@ -0,0 +1 @@
{"metadata":{"resultset":{"offset":1,"count":156,"limit":25}},"results":[{"date":"2009-05-01T00:00:00","datatype":"DP01","station":"GHCND:USC00010008","attributes":",0","value":14},{"date":"2009-05-01T00:00:00","datatype":"DP10","station":"GHCND:USC00010008","attributes":",0","value":14},{"date":"2009-05-01T00:00:00","datatype":"DP1X","station":"GHCND:USC00010008","attributes":",0","value":3},{"date":"2009-05-01T00:00:00","datatype":"DSND","station":"GHCND:USC00010008","attributes":"1,0","value":0},{"date":"2009-05-01T00:00:00","datatype":"DSNW","station":"GHCND:USC00010008","attributes":",0","value":0},{"date":"2009-05-01T00:00:00","datatype":"DYSD","station":"GHCND:USC00010008","attributes":"+,1,0","value":20090531},{"date":"2009-05-01T00:00:00","datatype":"DYSN","station":"GHCND:USC00010008","attributes":"+,,0","value":20090531},{"date":"2009-05-01T00:00:00","datatype":"DYXP","station":"GHCND:USC00010008","attributes":",,0","value":20090516},{"date":"2009-05-01T00:00:00","datatype":"EMSD","station":"GHCND:USC00010008","attributes":"1,,0,31,+","value":0.0},{"date":"2009-05-01T00:00:00","datatype":"EMSN","station":"GHCND:USC00010008","attributes":",,0,31,+","value":0.0},{"date":"2009-05-01T00:00:00","datatype":"EMXP","station":"GHCND:USC00010008","attributes":",,0,16,","value":1.43},{"date":"2009-05-01T00:00:00","datatype":"PRCP","station":"GHCND:USC00010008","attributes":",,,0","value":8.24},{"date":"2009-05-01T00:00:00","datatype":"SNOW","station":"GHCND:USC00010008","attributes":",,,0","value":0.0},{"date":"2009-06-01T00:00:00","datatype":"DP01","station":"GHCND:USC00010008","attributes":",0","value":3},{"date":"2009-06-01T00:00:00","datatype":"DP10","station":"GHCND:USC00010008","attributes":",0","value":3},{"date":"2009-06-01T00:00:00","datatype":"DP1X","station":"GHCND:USC00010008","attributes":",0","value":3},{"date":"2009-06-01T00:00:00","datatype":"DSND","station":"GHCND:USC00010008","attributes":",0","value":0},{"date":"2009-06-01T00:00:00","datatype":"DSNW","station":"GHCND:USC00010008","attributes":",0","value":0},{"date":"2009-06-01T00:00:00","datatype":"DYSD","station":"GHCND:USC00010008","attributes":"+,,0","value":20090630},{"date":"2009-06-01T00:00:00","datatype":"DYSN","station":"GHCND:USC00010008","attributes":"+,,0","value":20090630},{"date":"2009-06-01T00:00:00","datatype":"DYXP","station":"GHCND:USC00010008","attributes":",,0","value":20090615},{"date":"2009-06-01T00:00:00","datatype":"EMSD","station":"GHCND:USC00010008","attributes":",,0,30,+","value":0.0},{"date":"2009-06-01T00:00:00","datatype":"EMSN","station":"GHCND:USC00010008","attributes":",,0,30,+","value":0.0},{"date":"2009-06-01T00:00:00","datatype":"EMXP","station":"GHCND:USC00010008","attributes":",,0,15,","value":2.0},{"date":"2009-06-01T00:00:00","datatype":"PRCP","station":"GHCND:USC00010008","attributes":",,,0","value":4.43}]}

View File

@ -0,0 +1 @@
{"metadata":{"resultset":{"offset":1,"count":12,"limit":25}},"results":[{"name":"City","id":"CITY"},{"name":"Climate Division","id":"CLIM_DIV"},{"name":"Climate Region","id":"CLIM_REG"},{"name":"Country","id":"CNTRY"},{"name":"County","id":"CNTY"},{"name":"Hydrologic Accounting Unit","id":"HYD_ACC"},{"name":"Hydrologic Cataloging Unit","id":"HYD_CAT"},{"name":"Hydrologic Region","id":"HYD_REG"},{"name":"Hydrologic Subregion","id":"HYD_SUB"},{"name":"State","id":"ST"},{"name":"US Territory","id":"US_TERR"},{"name":"Zip Code","id":"ZIP"}]}

View File

@ -0,0 +1 @@
{"metadata":{"resultset":{"offset":1,"count":38862,"limit":25}},"results":[{"mindate":"1983-01-01","maxdate":"2021-07-24","name":"Abu Dhabi, AE","datacoverage":0.9977,"id":"CITY:AE000001"},{"mindate":"1944-03-01","maxdate":"2021-07-24","name":"Ajman, AE","datacoverage":0.9991,"id":"CITY:AE000002"},{"mindate":"1944-03-01","maxdate":"2021-07-24","name":"Dubai, AE","datacoverage":0.9991,"id":"CITY:AE000003"},{"mindate":"1944-03-01","maxdate":"2021-07-24","name":"Sharjah, AE","datacoverage":0.9991,"id":"CITY:AE000006"},{"mindate":"1966-03-02","maxdate":"2021-07-24","name":"Kabul, AF","datacoverage":0.9969,"id":"CITY:AF000007"},{"mindate":"1973-01-02","maxdate":"2020-12-31","name":"Kandahar, AF","datacoverage":1,"id":"CITY:AF000008"},{"mindate":"1877-04-01","maxdate":"2021-07-24","name":"Algiers, AG","datacoverage":1,"id":"CITY:AG000001"},{"mindate":"1909-11-01","maxdate":"2021-07-24","name":"Annaba, AG","datacoverage":1,"id":"CITY:AG000002"},{"mindate":"1973-04-01","maxdate":"2021-07-24","name":"Batna, AG","datacoverage":1,"id":"CITY:AG000003"},{"mindate":"1957-01-01","maxdate":"2021-07-24","name":"Bechar, AG","datacoverage":1,"id":"CITY:AG000004"},{"mindate":"1909-11-01","maxdate":"2021-07-24","name":"Bejaia, AG","datacoverage":1,"id":"CITY:AG000005"},{"mindate":"1880-05-01","maxdate":"2021-07-24","name":"Constantine, AG","datacoverage":1,"id":"CITY:AG000006"},{"mindate":"1995-10-01","maxdate":"2021-07-24","name":"Guelma, AG","datacoverage":1,"id":"CITY:AG000007"},{"mindate":"1888-01-01","maxdate":"2021-07-24","name":"Laghouat, AG","datacoverage":1,"id":"CITY:AG000008"},{"mindate":"1995-10-01","maxdate":"2021-07-24","name":"Medea, AG","datacoverage":0.9904,"id":"CITY:AG000009"},{"mindate":"1976-04-01","maxdate":"2021-07-24","name":"Mostaganem, AG","datacoverage":1,"id":"CITY:AG000010"},{"mindate":"1957-01-01","maxdate":"2021-07-24","name":"Oran, AG","datacoverage":1,"id":"CITY:AG000011"},{"mindate":"1985-02-01","maxdate":"2021-07-24","name":"Oum el Bouaghi, AG","datacoverage":1,"id":"CITY:AG000012"},{"mindate":"1981-01-01","maxdate":"2021-07-24","name":"Saida, AG","datacoverage":1,"id":"CITY:AG000013"},{"mindate":"1995-10-01","maxdate":"2021-07-24","name":"Sidi-Bel-Abbes, AG","datacoverage":0.9995,"id":"CITY:AG000014"},{"mindate":"1957-12-31","maxdate":"2021-07-24","name":"Skikda, AG","datacoverage":0.9993,"id":"CITY:AG000015"},{"mindate":"1940-01-01","maxdate":"2014-02-01","name":"Tamanrasset, AG","datacoverage":0.9973,"id":"CITY:AG000016"},{"mindate":"1981-01-01","maxdate":"2021-07-24","name":"Tlemcen, AG","datacoverage":1,"id":"CITY:AG000017"},{"mindate":"1881-07-01","maxdate":"1992-01-31","name":"Baku, AJ","datacoverage":0.991,"id":"CITY:AJ000001"},{"mindate":"1925-09-01","maxdate":"1991-12-31","name":"Naxcivian, AJ","datacoverage":1,"id":"CITY:AJ000002"}]}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"metadata":{"resultset":{"offset":1,"count":30415,"limit":25}},"results":[{"mindate":"1995-05-11","maxdate":"2021-07-25","name":"Zwolle, LA 71486","datacoverage":0.95,"id":"ZIP:71486"},{"mindate":"1995-04-13","maxdate":"2021-07-25","name":"Zwingle, IA 52079","datacoverage":0.95,"id":"ZIP:52079"},{"mindate":"1995-05-04","maxdate":"2021-07-25","name":"Zuni, VA 23898","datacoverage":0.95,"id":"ZIP:23898"},{"mindate":"1908-06-01","maxdate":"2021-07-25","name":"Zuni, NM 87327","datacoverage":1,"id":"ZIP:87327"},{"mindate":"1894-12-15","maxdate":"2021-07-25","name":"Zumbrota, MN 55992","datacoverage":1,"id":"ZIP:55992"},{"mindate":"1948-12-01","maxdate":"2021-07-25","name":"Zumbro Falls, MN 55991","datacoverage":1,"id":"ZIP:55991"},{"mindate":"1913-12-08","maxdate":"2021-07-25","name":"Zortman, MT 59546","datacoverage":1,"id":"ZIP:59546"},{"mindate":"1994-03-30","maxdate":"2021-07-25","name":"Zolfo Springs, FL 33890","datacoverage":1,"id":"ZIP:33890"},{"mindate":"1995-05-09","maxdate":"2021-07-25","name":"Zoe, KY 41397","datacoverage":0.95,"id":"ZIP:41397"},{"mindate":"1949-01-01","maxdate":"2021-07-25","name":"Zirconia, NC 28790","datacoverage":1,"id":"ZIP:28790"},{"mindate":"1948-01-01","maxdate":"2021-07-25","name":"Zionville, NC 28698","datacoverage":1,"id":"ZIP:28698"},{"mindate":"1950-10-17","maxdate":"2021-07-25","name":"Zionsville, PA 18092","datacoverage":0.9997,"id":"ZIP:18092"},{"mindate":"1957-12-01","maxdate":"2021-07-25","name":"Zionsville, IN 46077","datacoverage":1,"id":"ZIP:46077"},{"mindate":"1995-04-13","maxdate":"2021-07-25","name":"Zion, IL 60099","datacoverage":1,"id":"ZIP:60099"},{"mindate":"1951-11-01","maxdate":"2021-07-25","name":"Zion Grove, PA 17985","datacoverage":1,"id":"ZIP:17985"},{"mindate":"1995-11-01","maxdate":"2021-07-25","name":"Zimmerman, MN 55398","datacoverage":1,"id":"ZIP:55398"},{"mindate":"1911-05-01","maxdate":"2021-07-25","name":"Zillah, WA 98953","datacoverage":1,"id":"ZIP:98953"},{"mindate":"1994-06-15","maxdate":"2021-07-25","name":"Zieglerville, PA 19492","datacoverage":1,"id":"ZIP:19492"},{"mindate":"1994-03-30","maxdate":"2021-07-25","name":"Zephyrhills, FL 33542","datacoverage":1,"id":"ZIP:33542"},{"mindate":"1994-03-30","maxdate":"2021-07-25","name":"Zephyrhills, FL 33541","datacoverage":1,"id":"ZIP:33541"},{"mindate":"1994-03-30","maxdate":"2021-07-25","name":"Zephyrhills, FL 33540","datacoverage":1,"id":"ZIP:33540"},{"mindate":"1994-12-15","maxdate":"2021-07-25","name":"Zephyr, TX 76890","datacoverage":0.95,"id":"ZIP:76890"},{"mindate":"1995-05-09","maxdate":"2021-07-25","name":"Zephyr Cove, NV 89448","datacoverage":0.95,"id":"ZIP:89448"},{"mindate":"1969-11-19","maxdate":"2021-07-25","name":"Zenia, CA 95595","datacoverage":1,"id":"ZIP:95595"},{"mindate":"1994-04-01","maxdate":"2021-07-25","name":"Zenda, KS 67159","datacoverage":1,"id":"ZIP:67159"}]}

1
bench/penguin/bsd.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"@uri":"https://reststop.randomhouse.com/resources/authors?lastName=de%20Keijzer","author":{"@uri":"https://reststop.randomhouse.com/resources/authors/2180608","approved":"X","authordisplay":"Maja S.M. De Keijzer","authorfirst":"Maja S.M.","authorfirstlc":"maja s.m.","authorid":"2180608","authorlast":"De Keijzer","authorlastfirst":"DE KEIJZER, MAJA S.M.","authorlastlc":"de keijzer","titles":null,"lastinitial":"d","works":{"works":"586956"}}}

File diff suppressed because one or more lines are too long

1
bench/penguin/linux.json Normal file

File diff suppressed because one or more lines are too long

1
bench/penguin/rust.json Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

3926
bench/rv/agni.json Normal file

File diff suppressed because it is too large Load Diff

317
bench/rv/animal.json Normal file
View File

@ -0,0 +1,317 @@
[
{
"mandal": 1,
"meter": "Trishtup",
"sukta": 162,
"sungby": "Dirghatamas Auchathya",
"sungbycategory": "human male",
"sungfor": "Horse",
"sungforcategory": "animal"
},
{
"mandal": 1,
"meter": "Jagati",
"sukta": 162,
"sungby": "Dirghatamas Auchathya",
"sungbycategory": "human male",
"sungfor": "Horse",
"sungforcategory": "animal"
},
{
"mandal": 2,
"meter": "Jagati",
"sukta": 42,
"sungby": "Gritasmad Bhargav Shaunak",
"sungbycategory": "human male",
"sungfor": "Birds",
"sungforcategory": "animal"
},
{
"mandal": 2,
"meter": "Shakchari",
"sukta": 42,
"sungby": "Gritasmad Bhargav Shaunak",
"sungbycategory": "human male",
"sungfor": "Birds",
"sungforcategory": "animal"
},
{
"mandal": 3,
"meter": "Trishtup",
"sukta": 20,
"sungby": "Gathi Kaushik",
"sungbycategory": "human male",
"sungfor": "Dadhikra",
"sungforcategory": "animal"
},
{
"mandal": 4,
"meter": "Trishtup",
"sukta": 26,
"sungby": "Vamadev Gautam",
"sungbycategory": "human male",
"sungfor": "Hawk",
"sungforcategory": "animal"
},
{
"mandal": 4,
"meter": "Trishtup",
"sukta": 27,
"sungby": "Vamadev Gautam",
"sungbycategory": "human male",
"sungfor": "Hawk",
"sungforcategory": "animal"
},
{
"mandal": 4,
"meter": "Trishtup",
"sukta": 38,
"sungby": "Vamadev Gautam",
"sungbycategory": "human male",
"sungfor": "Dadhikra",
"sungforcategory": "animal"
},
{
"mandal": 4,
"meter": "Trishtup",
"sukta": 39,
"sungby": "Vamadev Gautam",
"sungbycategory": "human male",
"sungfor": "Dadhikra",
"sungforcategory": "animal"
},
{
"mandal": 4,
"meter": "Anushtup",
"sukta": 39,
"sungby": "Vamadev Gautam",
"sungbycategory": "human male",
"sungfor": "Dadhikra",
"sungforcategory": "animal"
},
{
"mandal": 4,
"meter": "Trishtup",
"sukta": 40,
"sungby": "Vamadev Gautam",
"sungbycategory": "human male",
"sungfor": "Dadhikra",
"sungforcategory": "animal"
},
{
"mandal": 4,
"meter": "Jagati",
"sukta": 40,
"sungby": "Vamadev Gautam",
"sungbycategory": "human male",
"sungfor": "Dadhikra",
"sungforcategory": "animal"
},
{
"mandal": 4,
"meter": "Anushtup",
"sukta": 57,
"sungby": "Vamadev Gautam",
"sungbycategory": "human male",
"sungfor": "Ox",
"sungforcategory": "animal"
},
{
"mandal": 4,
"meter": "Ushnik",
"sukta": 57,
"sungby": "Vamadev Gautam",
"sungbycategory": "human male",
"sungfor": "Ox",
"sungforcategory": "animal"
},
{
"mandal": 5,
"meter": "Trishtup",
"sukta": 43,
"sungby": "Atri Bhaum",
"sungbycategory": "human male",
"sungfor": "Cow",
"sungforcategory": "animal"
},
{
"mandal": 5,
"meter": "Trishtup",
"sukta": 45,
"sungby": "Sadaprin Atreya",
"sungbycategory": "human male",
"sungfor": "Sarama",
"sungforcategory": "animal"
},
{
"mandal": 6,
"meter": "Trishtup",
"sukta": 28,
"sungby": "Bharadwaj Barhaspatya",
"sungbycategory": "human male",
"sungfor": "Cow",
"sungforcategory": "animal"
},
{
"mandal": 6,
"meter": "Anushtup",
"sukta": 28,
"sungby": "Bharadwaj Barhaspatya",
"sungbycategory": "human male",
"sungfor": "Cow",
"sungforcategory": "animal"
},
{
"mandal": 6,
"meter": "Kakup",
"sukta": 48,
"sungby": "Shanyu Bharadwaj",
"sungbycategory": "human male",
"sungfor": "Cow",
"sungforcategory": "animal"
},
{
"mandal": 6,
"meter": "Ushnik",
"sukta": 48,
"sungby": "Shanyu Bharadwaj",
"sungbycategory": "human male",
"sungfor": "Cow",
"sungforcategory": "animal"
},
{
"mandal": 6,
"meter": "Trishtup",
"sukta": 50,
"sungby": "Rijishwa Bharadwaj",
"sungbycategory": "human male",
"sungfor": "Cow",
"sungforcategory": "animal"
},
{
"mandal": 6,
"meter": "Jagati",
"sukta": 75,
"sungby": "Payu Bharadwaj",
"sungbycategory": "human male",
"sungfor": "Horse",
"sungforcategory": "animal"
},
{
"mandal": 7,
"meter": "Jagati",
"sukta": 44,
"sungby": "Vasishth Maitravaruni",
"sungbycategory": "human male",
"sungfor": "Dadhikra",
"sungforcategory": "animal"
},
{
"mandal": 7,
"meter": "Trishtup",
"sukta": 44,
"sungby": "Vasishth Maitravaruni",
"sungbycategory": "human male",
"sungfor": "Dadhikra",
"sungforcategory": "animal"
},
{
"mandal": 7,
"meter": "Brihati",
"sukta": 55,
"sungby": "Vasishth Maitravaruni",
"sungbycategory": "human male",
"sungfor": "Sarama",
"sungforcategory": "animal"
},
{
"mandal": 7,
"meter": "Trishtup",
"sukta": 103,
"sungby": "Vasishth Maitravaruni",
"sungbycategory": "human male",
"sungfor": "Frogs",
"sungforcategory": "animal"
},
{
"mandal": 7,
"meter": "Anushtup",
"sukta": 103,
"sungby": "Vasishth Maitravaruni",
"sungbycategory": "human male",
"sungfor": "Frogs",
"sungforcategory": "animal"
},
{
"mandal": 8,
"meter": "Trishtup",
"sukta": 101,
"sungby": "Jamadagni Bhargav",
"sungbycategory": "human male",
"sungfor": "Cow",
"sungforcategory": "animal"
},
{
"mandal": 10,
"meter": "Trishtup",
"sukta": 14,
"sungby": "Yama Vaivasvat",
"sungbycategory": "divine male",
"sungfor": "Dogs",
"sungforcategory": "animal"
},
{
"mandal": 10,
"meter": "Anushtup",
"sukta": 19,
"sungby": "Mathit Yamayan",
"sungbycategory": "human male",
"sungfor": "Cow",
"sungforcategory": "animal"
},
{
"mandal": 10,
"meter": "Jagati",
"sukta": 65,
"sungby": "Vasukarn Vasukra",
"sungbycategory": "human male",
"sungfor": "Cow",
"sungforcategory": "animal"
},
{
"mandal": 10,
"meter": "Trishtup",
"sukta": 101,
"sungby": "Budh Saumya",
"sungbycategory": "divine male",
"sungfor": "Dadhikra",
"sungforcategory": "animal"
},
{
"mandal": 10,
"meter": "Trishtup",
"sukta": 108,
"sungby": "Pani",
"sungbycategory": "demon male",
"sungfor": "Sarama",
"sungforcategory": "animal"
},
{
"mandal": 10,
"meter": "Trishtup",
"sukta": 165,
"sungby": "Kapot Nairrit",
"sungbycategory": "human male",
"sungfor": "Pigeon",
"sungforcategory": "animal"
},
{
"mandal": 10,
"meter": "Trishtup",
"sukta": 169,
"sungby": "Shambar Kakshivat",
"sungbycategory": "human male",
"sungfor": "Cow",
"sungforcategory": "animal"
}
]

11
bench/rv/demons.json Normal file
View File

@ -0,0 +1,11 @@
[
{
"mandal": 10,
"meter": "Trishtup",
"sukta": 108,
"sungby": "Pani",
"sungbycategory": "demon male",
"sungfor": "Sarama",
"sungforcategory": "animal"
}
]

26255
bench/rv/human_male.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
[0,1,2,3,4,5,6,7,8,9,10]

View File

@ -0,0 +1 @@
{ ".": "first", "..": "second", "dot": "third", "dotdot": "fourth" }

View File

@ -0,0 +1 @@
{ "name": "Michael Greenberg", "eyes": 2, "fingernails": 10, "human": true }

View File

@ -0,0 +1 @@
{ "name": "Michael Greenberg", "eyes": 2, "fingernails": 10, "human": true, "problems": null }

4
completions/Makefile Normal file
View File

@ -0,0 +1,4 @@
.PHONY: all
all:
for x in bash fish zsh; do cargo run -- --completions $$x >ffs.$$x; done

View File

@ -20,7 +20,7 @@ _ffs() {
case "${cmd}" in
ffs)
opts=" -q -d -i -h -V -u -g -o -s -t -m --quiet --debug --exact --no-xattr --keep-macos-xattr --unpadded --readonly --no-output --in-place --pretty --help --version --completions --uid --gid --mode --dirmode --munge --output --source --target --mount --new <INPUT> "
opts=" -q -d -i -h -V -u -g -o -s -t -m --quiet --time --debug --exact --no-xattr --keep-macos-xattr --unpadded --readonly --no-output --in-place --pretty --help --version --completions --uid --gid --mode --dirmode --munge --output --source --target --mount --new <INPUT> "
if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
return 0

View File

@ -10,6 +10,7 @@ complete -c ffs -n "__fish_use_subcommand" -s t -l target -d 'Specify the target
complete -c ffs -n "__fish_use_subcommand" -s m -l mount -d 'Sets the mountpoint; will be inferred when using a file, but must be specified when running on stdin'
complete -c ffs -n "__fish_use_subcommand" -l new -d 'Mounts an empty filesystem, inferring a mountpoint and output format'
complete -c ffs -n "__fish_use_subcommand" -s q -l quiet -d 'Quiet mode (turns off all errors and warnings, enables `--no-output`)'
complete -c ffs -n "__fish_use_subcommand" -l time -d 'Emit timing information on stderr in an \'event,time\' format; time is in nanoseconds'
complete -c ffs -n "__fish_use_subcommand" -s d -l debug -d 'Give debug output on stderr'
complete -c ffs -n "__fish_use_subcommand" -l exact -d 'Don\'t add newlines to the end of values that don\'t already have them (or strip them when loading)'
complete -c ffs -n "__fish_use_subcommand" -l no-xattr -d 'Don\'t use extended attributes to track metadata (see `man xattr`)'

View File

@ -34,6 +34,7 @@ _ffs() {
'(-i --in-place -s --source -o --output)--new=[Mounts an empty filesystem, inferring a mountpoint and output format]' \
'-q[Quiet mode (turns off all errors and warnings, enables `--no-output`)]' \
'--quiet[Quiet mode (turns off all errors and warnings, enables `--no-output`)]' \
'--time[Emit timing information on stderr in an '\''event,time'\'' format; time is in nanoseconds]' \
'-d[Give debug output on stderr]' \
'--debug[Give debug output on stderr]' \
'--exact[Don'\''t add newlines to the end of values that don'\''t already have them (or strip them when loading)]' \

View File

@ -1,4 +1,4 @@
% FFS(1) Version 0.1.0 | File Filesystem Documentation
% FFS(1) Version 0.1.1 | File Filesystem Documentation
% Michael Greenberg
# NAME
@ -57,6 +57,10 @@ installed on your system to use *ffs*.
: Mounted filesystem will be readonly
--time
: Emit timing information on stderr in an 'event,time' format; time is in nanoseconds
--unpadded
: Don't pad the numeric names of list elements with zeroes; will not

View File

@ -1,6 +1,6 @@
.\" Automatically generated by Pandoc 2.9.1.1
.\"
.TH "FFS" "1" "" "Version 0.1.0" "File Filesystem Documentation"
.TH "FFS" "1" "" "Version 0.1.1" "File Filesystem Documentation"
.hy
.SH NAME
.PP
@ -59,6 +59,10 @@ Quiet mode (turns off all errors and warnings, enables
--readonly
Mounted filesystem will be readonly
.TP
--time
Emit timing information on stderr in an \[aq]event,time\[aq] format;
time is in nanoseconds
.TP
--unpadded
Don\[aq]t pad the numeric names of list elements with zeroes; will not
sort properly

47
run_bench.sh Executable file
View File

@ -0,0 +1,47 @@
#!/bin/sh
set -e
TIMESTAMP=$(date +"%Y%m%d_%H:%M:%S")
usage() {
exec >&2
printf "Usage: %s [-n NUM_RUNS]\n\n" "$(basename $0)"
printf " -n NUM_RUNS the number of runs for each test case (defaults to $NUM_RUNS_DEFAULT)\n"
exit 2
}
ARGS=""
while getopts ":n:h" opt
do
case "$opt" in
(n) if [ $((OPTARG)) -le 0 ]
then
printf "NUM_RUNS must be a positive number; got '%s'\n\n" "$OPTARG"
usage
fi
ARGS="$ARGS -n $OPTARG"
;;
(h) usage
;;
(*) printf "Unrecognized argument '%s'\n\n" "$OPTARG"
usage
;;
esac
done
shift $((OPTIND - 1))
[ $# -eq 0 ] || usage
cd bench
BENCH="../${TIMESTAMP}_bench.log"
./bench.sh $ARGS >"$BENCH"
./mk_micro.sh
MICRO_RAW=$(mktemp)
./bench.sh -d micro $ARGS >"$MICRO_RAW"
MICRO="../${TIMESTAMP}_micro.log"
./fixup_micro.sh "$MICRO_RAW" >"$MICRO"
rm "$MICRO_RAW"
./generate_charts.R "$BENCH" "$MICRO"

View File

@ -25,6 +25,11 @@ pub fn app() -> App<'static, 'static> {
.short("q")
.overrides_with("DEBUG")
)
.arg(
Arg::with_name("TIMING")
.help("Emit timing information on stderr in an 'event,time' format; time is in nanoseconds")
.long("time")
)
.arg(
Arg::with_name("DEBUG")
.help("Give debug output on stderr")

View File

@ -41,6 +41,7 @@ pub struct Config {
pub input: Input,
pub output: Output,
pub pretty: bool,
pub timing: bool,
pub mount: Option<PathBuf>,
pub cleanup_mount: bool,
}
@ -146,6 +147,7 @@ impl Config {
}
// simple flags
config.timing = args.is_present("TIMING");
config.add_newlines = !args.is_present("EXACT");
config.pad_element_names = !args.is_present("UNPADDED");
config.read_only = args.is_present("READONLY");
@ -593,6 +595,7 @@ impl Default for Config {
input: Input::Stdin,
output: Output::Stdout,
pretty: false,
timing: false,
mount: None,
cleanup_mount: false,
}

View File

@ -6,7 +6,7 @@ use tracing::{debug, error, info, instrument, warn};
use fuser::FileType;
use super::config::{ERROR_STATUS_FUSE, Config, Input, Munge, Output};
use super::config::{Config, Input, Munge, Output, ERROR_STATUS_FUSE};
use super::fs::{DirEntry, DirType, Entry, Inode, FS};
use ::toml as serde_toml;
@ -133,6 +133,24 @@ impl Format {
/// NB there is no check that `self == fs.config.input_format`!
#[instrument(level = "info", skip(config))]
pub fn load(&self, config: Config) -> FS {
macro_rules! time_ns {
($msg:expr, $e:expr) => {{
let start = std::time::Instant::now();
let v = $e;
let msg = $msg;
let elapsed = start.elapsed().as_nanos();
if config.timing {
eprintln!("{},{}", msg, elapsed);
} else {
info!("{} ({}ns)", msg, elapsed);
}
v
}};
}
info!("loading");
let mut inodes: Vec<Option<Inode>> = Vec::new();
let reader: Box<dyn std::io::Read> = match &config.input {
@ -164,25 +182,19 @@ impl Format {
match self {
Format::Json => {
info!("reading json value");
let v: serde_json::Value = serde_json::from_reader(reader).expect("JSON");
info!("building inodes");
fs_from_value(v, &config, &mut inodes);
info!("done");
let v: serde_json::Value = time_ns!(
"reading",
serde_json::from_reader(reader).expect("JSON")
);
time_ns!("loading", fs_from_value(v, &config, &mut inodes));
}
Format::Toml => {
info!("reading toml value");
let v = toml::from_reader(reader).expect("TOML");
info!("building inodes");
fs_from_value(v, &config, &mut inodes);
info!("done");
let v = time_ns!("reading", toml::from_reader(reader).expect("TOML"));
time_ns!("loading", fs_from_value(v, &config, &mut inodes));
}
Format::Yaml => {
info!("reading toml value");
let v = yaml::from_reader(reader).expect("YAML");
info!("building inodes");
fs_from_value(v, &config, &mut inodes);
info!("done");
let v = time_ns!("reading", yaml::from_reader(reader).expect("YAML"));
time_ns!("loading", fs_from_value(v, &config, &mut inodes));
}
};
@ -195,6 +207,22 @@ impl Format {
/// NB there is no check that `self == fs.config.output_format`!
#[instrument(level = "info", skip(fs))]
pub fn save(&self, fs: &FS) {
macro_rules! time_ns {
($msg:expr, $e:expr) => {{
let start = std::time::Instant::now();
let v = $e;
let msg = $msg;
let elapsed = start.elapsed().as_nanos();
if fs.config.timing {
eprintln!("{},{}", msg, elapsed);
} else {
info!("{} ({}ns)", msg, elapsed);
}
v
}};
}
let writer: Box<dyn std::io::Write> = match &fs.config.output {
Output::Stdout => {
debug!("outputting on STDOUT");
@ -212,36 +240,35 @@ impl Format {
match self {
Format::Json => {
info!("generating json value");
let v: serde_json::Value = value_from_fs(fs, fuser::FUSE_ROOT_ID);
info!("writing");
let v: serde_json::Value =
time_ns!("saving", value_from_fs(fs, fuser::FUSE_ROOT_ID));
debug!("outputting {}", v);
if fs.config.pretty {
serde_json::to_writer_pretty(writer, &v).unwrap();
} else {
serde_json::to_writer(writer, &v).unwrap();
}
info!("done")
time_ns!(
"writing",
if fs.config.pretty {
serde_json::to_writer_pretty(writer, &v).unwrap();
} else {
serde_json::to_writer(writer, &v).unwrap();
}
);
}
Format::Toml => {
info!("generating toml value");
let v: serde_toml::Value = value_from_fs(fs, fuser::FUSE_ROOT_ID);
info!("writing");
let v: serde_toml::Value =
time_ns!("saving", value_from_fs(fs, fuser::FUSE_ROOT_ID));
debug!("outputting {}", v);
if fs.config.pretty {
toml::to_writer_pretty(writer, &v).unwrap();
} else {
toml::to_writer(writer, &v).unwrap();
}
info!("done");
time_ns!(
"writing",
if fs.config.pretty {
toml::to_writer_pretty(writer, &v).unwrap();
} else {
toml::to_writer(writer, &v).unwrap();
}
);
}
Format::Yaml => {
info!("generating yaml value");
let v: yaml::Value = value_from_fs(fs, fuser::FUSE_ROOT_ID);
info!("writing");
let v: yaml::Value = time_ns!("saving", value_from_fs(fs, fuser::FUSE_ROOT_ID));
debug!("outputting {}", v);
yaml::to_writer(writer, &v).unwrap();
info!("done");
time_ns!("writing", yaml::to_writer(writer, &v).unwrap());
}
}
}

6
tests/README.md Normal file
View File

@ -0,0 +1,6 @@
To run tests, run `run_tests.sh` (in the repo root).
These tests cover a wide variety of features. Testing is slow because
mountpoints aren't _immediately_ available after running `ffs` in the
background---you need a few milliseconds, but there's no portable way
to sleep just a little.

View File

@ -13,6 +13,7 @@ fail() {
}
TESTS="$(pwd)"
TIMEOUT="$(cd ../utils; pwd)/timeout"
D=$(mktemp -d)
@ -29,7 +30,7 @@ chmod -w unwriteable
# in place mount, mountpoint exists
mkdir single
"$TESTS"/timeout -t 2 ffs -i single.json 2>single.err
"$TIMEOUT" -t 2 ffs -i single.json 2>single.err
[ $? -eq 1 ] || fail imountstatus
[ -s single.err ] || fail imountmsg
rmdir single
@ -37,7 +38,7 @@ rm single.err
# in place, can't make mountpoint
cd unwriteable
"$TESTS"/timeout -t 2 ffs -i single.json 2>../single.err
"$TIMEOUT" -t 2 ffs -i single.json 2>../single.err
[ $? -eq 1 ] || fail imkmountstatus
cd ..
[ -s single.err ] || fail imkmountmsg
@ -45,7 +46,7 @@ rm single.err
# new, mountpoint exists
mkdir foo
"$TESTS"/timeout -t 2 ffs --new foo.json 2>foo.err
"$TIMEOUT" -t 2 ffs --new foo.json 2>foo.err
[ $? -eq 1 ] || fail newmountstatus
[ -s foo.err ] || fail newmountmsg
rmdir foo
@ -53,47 +54,47 @@ rm foo.err
# new, can't make mountpoint
cd unwriteable
"$TESTS"/timeout -t 2 ffs --new foo.json 2>../foo.err
"$TIMEOUT" -t 2 ffs --new foo.json 2>../foo.err
[ $? -eq 1 ] || fail newmkmountstatus
cd ..
[ -s foo.err ] || fail newmkmountmsg
rm foo.err
# input file, can't infer mountpoint
"$TESTS"/timeout -t 2 ffs --new .. 2>dotdot.err
"$TIMEOUT" -t 2 ffs --new .. 2>dotdot.err
[ $? -eq 1 ] || fail newdotdotmountstatus
[ -s dotdot.err ] || fail newdotdotmountmsg
rm dotdot.err
# --new, output file exists
touch foo.yaml
"$TESTS"/timeout -t 2 ffs --new foo.yaml 2>foo.err
"$TIMEOUT" -t 2 ffs --new foo.yaml 2>foo.err
[ $? -eq 1 ] || fail omountstatus
[ -s foo.err ] || fail omountmsg
rm foo.yaml
rm foo.err
# --new, mountpoint doesn't exist
"$TESTS"/timeout -t 2 ffs -m notthere --new foo.json 2>foo.err
"$TIMEOUT" -t 2 ffs -m notthere --new foo.json 2>foo.err
[ $? -eq 1 ] || fail mmountstatus1
[ -s foo.err ] || fail mmountmsg1
rm foo.err
# mountpoint doesn't exist
"$TESTS"/timeout -t 2 ffs -m notthere single.json 2>single.err
"$TIMEOUT" -t 2 ffs -m notthere single.json 2>single.err
[ $? -eq 1 ] || fail mmountstatus2
[ -s single.err ] || fail mmountmsg2
rm single.err
# input file doesn't exists
"$TESTS"/timeout -t 2 ffs nonesuch.toml 2>nonesuch.err
"$TIMEOUT" -t 2 ffs nonesuch.toml 2>nonesuch.err
[ $? -eq 1 ] || fail inputmountstatus1
[ -s nonesuch.err ] || fail inputmountmsg1
rm nonesuch.err
# input file, mountpoint exists
mkdir single
"$TESTS"/timeout -t 2 ffs single.json 2>single.err
"$TIMEOUT" -t 2 ffs single.json 2>single.err
[ $? -eq 1 ] || fail inputmountstatus2
[ -s single.err ] || fail inputmountmsg2
rmdir single
@ -101,74 +102,74 @@ rm single.err
# input file, can't make mount point
cd unwriteable
"$TESTS"/timeout -t 2 ffs ../single.json 2>../single.err
"$TIMEOUT" -t 2 ffs ../single.json 2>../single.err
[ $? -eq 1 ] || fail inputmkmountstatus
cd ..
[ -s single.err ] || fail inputmkmountmsg
rm single.err
# input file, can't infer mountpoint
"$TESTS"/timeout -t 2 ffs .. 2>dotdot.err
"$TIMEOUT" -t 2 ffs .. 2>dotdot.err
[ $? -eq 1 ] || fail inputdotdotmountstatus
[ -s dotdot.err ] || fail inputdotdotmountmsg
rm dotdot.err
# unreadable input
"$TESTS"/timeout -t 2 ffs unreadable.json 2>ur.err
"$TIMEOUT" -t 2 ffs unreadable.json 2>ur.err
[ $? -eq 1 ] || fail unreadablemountstatus
[ -s ur.err ] || fail unreadablemountmsg
rm ur.err
# plain value input
"$TESTS"/timeout -t 2 ffs false.json 2>false.err
"$TIMEOUT" -t 2 ffs false.json 2>false.err
[ $? -eq 1 ] || fail falsemountstatus
[ -s false.err ] || fail falsemountmsg
rm false.err
# bad mount point (fuser is masking this error)
# "$TESTS"/timeout -t 2 ffs /etc single.json 2>etc.err
# "$TIMEOUT" -t 2 ffs /etc single.json 2>etc.err
# [ $? -eq 1 ] || fail etcmountstatus
# [ -s etc.err ] || fail etcmountmsg
# rm etc.err
# bad shell completion
"$TESTS"/timeout -t 2 ffs --completions smoosh 2>comp.err
"$TIMEOUT" -t 2 ffs --completions smoosh 2>comp.err
[ $? -eq 2 ] || fail compmountstatus
[ -s comp.err ] || fail compmountmsg
rm comp.err
# bad mode
"$TESTS"/timeout -t 2 ffs --mode 888 2>mode.err
"$TIMEOUT" -t 2 ffs --mode 888 2>mode.err
[ $? -eq 2 ] || fail modemountstatus
[ -s mode.err ] || fail modemountmsg
rm mode.err
# bad dirmode
"$TESTS"/timeout -t 2 ffs --dirmode 888 2>dirmode.err
"$TIMEOUT" -t 2 ffs --dirmode 888 2>dirmode.err
[ $? -eq 2 ] || fail dirmodemountstatus
[ -s dirmode.err ] || fail dirmodemountmsg
rm dirmode.err
# new and input file
"$TESTS"/timeout -t 2 ffs --new foo.json single.json 2>ni.err
"$TIMEOUT" -t 2 ffs --new foo.json single.json 2>ni.err
[ $? -eq 2 ] || fail nimountstatus
[ -s ni.err ] || fail nimountmsg
rm ni.err
# unknown --source
"$TESTS"/timeout -t 2 ffs --source hieratic single.json 2>source.err
"$TIMEOUT" -t 2 ffs --source hieratic single.json 2>source.err
[ $? -eq 2 ] || fail sourcemountstatus
[ -s source.err ] || fail sourcemountmsg
rm source.err
# unknown --target
"$TESTS"/timeout -t 2 ffs --target hieratic single.json 2>target.err
"$TIMEOUT" -t 2 ffs --target hieratic single.json 2>target.err
[ $? -eq 2 ] || fail targetmountstatus
[ -s target.err ] || fail targetmountmsg
rm target.err
# stdin read, no mountpoint
"$TESTS"/timeout -t 2 ffs 2>im.err
"$TIMEOUT" -t 2 ffs 2>im.err
[ $? -eq 2 ] || fail immountstatus
[ -s im.err ] || fail immountmsg
rm im.err

View File

@ -13,6 +13,7 @@ fail() {
}
TESTS="$(pwd)"
TIMEOUT="$(cd ../utils; pwd)/timeout"
D=$(mktemp -d)
@ -35,7 +36,7 @@ esac
cp ../single.json .
"${TESTS}"/timeout -t 3 -l single.timeout ffs -i single.json 2>single.err
"$TIMEOUT" -t 3 -l single.timeout ffs -i single.json 2>single.err
NESTEDSTATUS=$?
[ -f single.timeout ] && fail timeout
[ -s single.err ] || fail error

102
utils/synth_json Executable file
View File

@ -0,0 +1,102 @@
#!/usr/bin/env python3
from sys import argv, stderr
import os
import json
counter = 0
letters = list("abcdefghijklmnopqrstuvwxyz")
def fresh_name():
global counter
num = counter
counter = counter + 1
name = ""
while num > 0 or name == "":
name += letters[num % 26]
num //= 26
return name
def object(field,value):
o = dict()
o[field] = value
return o
def deep(kind, depth):
if kind == "list":
if depth <= 0:
return list()
f = lambda v: [v]
elif kind == "named":
if depth <= 0:
return dict()
def f(v):
o = dict()
o[fresh_name()] = v
return o
else:
raise(ValueError("Unknown kind '{}'".format(kind)))
v = None
for i in range(0,depth):
v = f(v)
return v
def wide(kind, width):
if kind == "list":
v = list()
def f(v):
v.append(None)
return v
elif kind == "named":
v = dict()
def f(v):
v[fresh_name()] = None
return v
else:
raise(ValueError("Unknown kind '{}'".format(kind)))
for i in range(0,width):
v = f(v)
return v
def usage():
print("Usage: {} [list|named] [wide|deep] [size]".format(os.path.basename(argv[0])), file=stderr)
exit(2)
if __name__ == "__main__":
if len(argv) != 4:
usage()
kind,approach,size = argv[1:]
if kind.lower().strip() not in ["named", "list"]:
print("Unknown kind '{}' (expected 'list' or 'named')".format(kind), file=stderr)
usage()
else:
kind = kind.lower().strip()
if approach.lower().strip() == "wide":
f = wide
elif approach.lower().strip() == "deep":
f = deep
else:
print("Unknown approach '{}' (expected 'wide' or 'deep')".format(kind), file=stderr)
usage()
try:
size = int(size)
except:
print("Unknown size '{}', expected non-negative number".format(size), file=stderr)
usage()
print(json.dumps(f(kind, size), separators=(',', ':')))