Commit Graph

52 Commits

Author SHA1 Message Date
Denis Makogon
b4b5302a44 Addressing certain comments from last review 2017-10-07 01:20:53 +03:00
Denis Makogon
de7b4e6067 Returning error instead of writing it to a response writer 2017-10-07 00:52:01 +03:00
Denis Makogon
7dd9b5a4cd We still can write JSON request object in parts
except just copying content from request body to STDIN
  we need to write encoded data,
  so we're using STDIN JSON stream encoder.
2017-10-07 00:43:09 +03:00
Denis Makogon
588d9e523b Do not forget to close request body 2017-10-07 00:43:09 +03:00
Denis Makogon
c2ee67fb21 Revisiting request body processing 2017-10-07 00:43:09 +03:00
Denis Makogon
1f589d641e Let function write headers to a response 2017-10-07 00:43:09 +03:00
Denis Makogon
caf1488dd9 Make Dispatch cleaner 2017-10-07 00:43:09 +03:00
Denis Makogon
2250e1d08c Get rid of content-length-based copying 2017-10-07 00:43:08 +03:00
Denis Makogon
1cdd241920 Trying to avoid buffers and write directly to pipe
this change makes Dispatch write request body and
 http headers directly to pipe one by one
 in case of non-empty request body,
 if not - write headers and close finalize JSON
2017-10-07 00:43:08 +03:00
Denis Makogon
955b294bc6 Trying to avoid any buffering 2017-10-07 00:43:08 +03:00
Denis Makogon
da9629d8dc Use STDIN as writer for encoding func's JSON input data instead of buffering 2017-10-07 00:43:08 +03:00
Denis Makogon
0316cd90a1 Dismiss redundant function 2017-10-07 00:43:08 +03:00
Denis Makogon
3fb040f293 Addressing comments
What's new?
  - unmarshal JSON response only in case of HTTP response writer
2017-10-07 00:43:07 +03:00
Denis Makogon
783490dc79 Addressing certain comments
What's new?
 - better error handling
 - still need to decode JSON from function because we need status code and body
 - prevent request body to be a problem by deferring its close
 - moving examples around: putting http and json samples into one folder
2017-10-07 00:43:07 +03:00
Denis Makogon
1882845a61 Respond with any error that happends during JSON dispatching 2017-10-07 00:43:07 +03:00
Denis Makogon
3da9ad4328 Using io.LimitReader as the way to control size of request body with respect to content length 2017-10-07 00:43:07 +03:00
Denis Makogon
ecaa5eefbf Cleaning up code
Getting rid of request url, call id, method: all of them are
 redundant and available through env
2017-10-07 00:43:07 +03:00
amykang2020
b6b9b55ca9 apply/make Travis's json-format branch prototype to work with latest restructured master; added StatusCode to JSONOutput server-function contract 2017-10-07 00:43:07 +03:00
Reed Allman
8a59654582 go vet yourself (#397)
go vet caught some nifty bugs. so fixed those here, and also made it so that
we vet everything from now on since the robots seem to do a better job of
vetting than we have managed to.

also adds gofmt check to circle. could move this to the test.sh script (didn't
want a script calling a script, because $reasons) and it's nice and isolated
in its own little land as it is. side note, changed the script so it runs in
100ms instead of 3s, i think find is a lot faster than go list.

attempted some minor cleanup of various scripts
2017-10-06 08:42:33 -07:00
Reed Allman
caba9e0ec6 more strict configuration of routes
* idle_timeout max of 1h
* timeout max of 120s for sync, 1h for async
* max memory of 8GB
* do full route validation before call invocation
* ensure that idle_timeout >= timeout

we are now doing validation of updating route inside of the database
transaction, which is what we should have been doing all along really.
we need this behavior to ensure that the idle timeout is longer than the
timeout, among other benefits (like not updating the most recent version of
the existing struct and overwriting previous updates, yay). since we have
this, we can get rid of the weird skipZero behavior on validate too and
validate the real deal holyfield.

validating the route before making the call is handy so that we don't do weird
things like run a func that wants to use 300GB of RAM and run for 3 weeks.

closes #192
closes #344
closes #162
2017-09-21 04:04:34 -07:00
Reed Allman
b3157401e8 improve ux for ooms
closes #350
2017-09-20 17:10:42 -07:00
Reed Allman
6b7b1e3c63 Merge pull request #354 from fnproject/stats
Extend stats to report Failed calls
2017-09-22 10:50:59 -07:00
Nigel Deakin
54407f7b74 Extend stats to report Failed calls 2017-09-22 17:36:43 +01:00
Travis Reeder
deb2ae8103 Merge branch 'master' into app-yaml 2017-09-20 11:49:33 -07:00
Travis Reeder
904f288ed6 Replace FN_ROUTE with FN_PATH 2017-09-20 11:35:18 -07:00
Reed Allman
22a1b296e3 fix slot races
I'd be pretty surprised if these were happening but meh, a computer running at
capacity can make the runtime scheduler do all kinds of weird shit, so this
locks down the behavior around slot launching.

I didn't load test much as there are cries of 'wolf' running amok, and it's
late, so this could be off a little -- but I think it's about this easy.  cold
is the only one launching slots for itself, so it should always receive its
own slot (provided within time bounds). for hot we just need a way to tell the
ram token allocator that we aren't there anymore, so that somebody can close
the token (important).

If the bug still persists then it seems likely that there is another bug
around timing I'm not aware of (possible, but unlikely) or the more likely
case that it's actually taking up to the timeout to launch a container / find
a ram slot / find a free container. Otherwise, it's not related to the agent
and the http server timeouts may need fiddling with (read / write timeout),
if ruby client is failing to connect though I'm guessing that it's just that
nobody is reading the body (i.e. no function runs) and the error handling
isn't very well done, as we are replying with 504 if we hit a timeout (but if
nobody is listening, they won't get it).
2017-09-20 10:43:12 -07:00
Nigel Deakin
ae69bb37e3 Update global stats charts to show bteakdown by function 2017-09-19 15:05:37 +01:00
Travis Reeder
75e2051169 Example app structure. round 1. 2017-09-18 17:16:59 -07:00
Reed Allman
53ff665d69 not ready for spans yet in hot land 2017-09-08 05:06:35 -07:00
Reed Allman
4ce9163d99 nuke some TODO yey 2017-09-07 20:15:39 -07:00
Reed Allman
1811b4e230 make fn logger more reasonable
something still feels off with this, but i tinkered with it for a day-ish and
didn't come up with anything a whole lot better. doing a lot of the
maneuvering in the caller seemed better but it was just bloating up GetCall so
went back to having it basically like it was, but returning the limited
underlying buffer to read from so we can ship to the db.

some small changes to the LogStore interface, swapped it to take an
io.Reader instead of a string for more flexibility in the future while
essentially maintaining the same level of performance that we have now.
i'm guessing in the not so distant future we'll ship these to some s3 like
service and it would be better to stream them in than carry around a giant
string anyway. also, carrying around up to 1MB buffers in memory isn't great,
we may want to switch to file backed logs for calls, too. using io.Reader for
logs should make #279 more reasonable if/once we move to some s3-like thing,
we can stream from the log storage service direct to clients.

this fixes the span being out of whack and allows the 'right' context to be
used to upload logs (next to inserting the call). deletes the dbWriter we had,
and we just do this in call.End now (which makes sense to me at least).
removes the dupe code for making an stderr for hot / cold and simplifies the
way to get a func logger (no more 7 param methods yay).

closes #298
2017-09-07 20:15:39 -07:00
Reed Allman
1d0a63ca99 add id to all call invocation logs 2017-09-07 18:37:22 -07:00
Reed Allman
700078ccb9 bubble up some docker errors to user
currently:

* container ran out of memory (code 137)
* container exited with other code != 0
* unable to pull image (auth/404)

there may be others but this is a good start (the most common). notably, for
both hot and cold these should bubble up (if deterministic, which hub isn't
always), and these are useful for users to use in debugging why things aren't
working.

added tests to make sure that these behaviors are working.

also changed the behavior such that when the container exits we return a 502
instead of a 503, just to be able to distinguish the fact that fn is working
as expected but the container is acting funky (400 is weird here, so idk).

removed references to old IsUserVisible crap and slightly changed the
interface for RunResult for plumbing reasons (to get the error type,
specifically).

fixed an issue where if ~/.docker/config.json exists sometimes pulling images
wouldn't work deterministically (should be more inline w/ expectations now)

closes #275
2017-09-07 11:55:50 -07:00
Reed Allman
3707935f56 Merge pull request #314 from fnproject/302
Implementing force delete for apps
2017-09-13 10:01:59 -07:00
Reed Allman
f032ce0556 info line this (#316) 2017-09-11 13:05:49 -07:00
Denis Makogon
774d53662f Making logs app-bound
Partially-Closes: #302
2017-09-11 11:04:54 +03:00
Reed Allman
59d95d660a push app/route cache down to datastore (#303)
cache now implements models.Datastore by just embedding one and then changing
GetApp and GetRoute to have the cache inside. this makes it really flexible
for things like testing, so now the agent doesn't automagically do caching,
now it must be passed a datastore that was wrapped with a cache datastore.
the datastore in the server can remain separate and not use the cache still,
and then now the agent when running fn 'for real' is configured with the cache
baked in. this seems a lot cleaner than what we had and gets the cache out of
the way and it's easier to swap in / out / extend.
2017-09-08 09:18:36 -07:00
Denis Makogon
8a337e744b Addresing new comments 2017-09-07 15:17:39 +03:00
Denis Makogon
57a577dfc9 Wiring new context with initial span 2017-09-06 21:55:52 +03:00
Denis Makogon
9a89366d1b Addressing review comments
reverting query string caching in favour of Go 1.9 sqlx features
 moving context definition out of call.End to upper level
2017-09-06 21:48:29 +03:00
Denis Makogon
6a541139a9 Make call.End more solid 2017-09-06 21:48:29 +03:00
Denis Makogon
6ac579f296 Formatting issues
Aren't we running go-fmt.sh in CI?
2017-09-06 21:48:28 +03:00
Reed Allman
875300dcd1 Merge pull request #292 from fnproject/get-body
stop forcing GET bodies through ?payload
2017-09-06 11:26:23 -07:00
Reed Allman
debbef96fa add headers right way, more docs 2017-09-06 07:34:55 -07:00
Reed Allman
639adf70eb ensure that certain request headers may not be overwritten / added to 2017-09-06 07:24:50 -07:00
Reed Allman
c10462cdc5 FN_MEMORY, FN_TYPE and precedence for app/route vars 2017-09-06 07:24:50 -07:00
Reed Allman
2341456334 FN_ prefix env vars
this adds `FN_` in front of env vars that we are injecting into calls, for
namespacing reasons. this will break code relying on the current variables but
if we want to do this, the chance is now really. alternatively, we could
maintain both the old and new for a short period of time to ease the
adjustment (speak now...). updated the docs, as well.

this also adds tests for the notoriously finicky configuration of the env vars
and headers when setting up a call. this won't test the container / request
for the call is actually receiving them, but it's a decent start and will yell
loudly enough upon formatting breakage.

added back FXLB_WAIT to a couple places so the lb can ride again

one thing for feedback:

headers are a bit confusing at the moment (not from this change, but that
behavior is kept here for now), we've a chance to fix them. currently, headers
in the request __are not__ prefixed with `FN_HEADER_`, i.e. 'hot'+sync containers
will receive `Content-Length` in the http request headers, yet a 'cold'
container from the same request would receive `FN_HEADER_Content-Length` in
its environment. This is additionally confusing because if this function were
hot+async, it would receive `FN_HEADER_Content-Length` in the headers, where
just changing it to sync goes back to `Content-Length`. If that was confusing,
then point made ;)

I propose to remove the `FN_HEADER_` prefix for request headers in the
environment, so that the request headers and env will match, as request
headers already are of this format (not prefixed). please lmk thoughts here

Would be fine with going back to the 'plain' vars too, then this patch will
mostly just be adding tests and changing `FN_FORMAT` to `FORMAT`. obviously,
from the examples, it's a bit ingrained now. anyway, entirely up to y'all.
2017-09-06 07:24:50 -07:00
Owen Cliffe
3a231d6296 review feedback 2017-09-06 15:05:47 +01:00
Owen Cliffe
33060bcb9e Add headers to env for default functions 2017-09-06 13:59:10 +01:00
Reed Allman
4569b7fd69 stop forcing GET bodies through ?payload
it's unclear why we had this behavior in the first place, but alas, no more.

closes #264
2017-09-05 14:26:03 -07:00