couchdb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Christopher Bonhage (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (COUCHDB-1651) Server responds 400 "Exceeded rewrite recursion limit" indefinitely
Date Fri, 15 Feb 2013 20:19:12 GMT

    [ https://issues.apache.org/jira/browse/COUCHDB-1651?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13579479#comment-13579479
] 

Christopher Bonhage commented on COUCHDB-1651:
----------------------------------------------

Alright, I've figured out what's going on!

I added some logging to couch_httpd_rewrite:handle_rewrite_req/3:

    MaxRewritesList = couch_config:get("httpd", "rewrite_limit", "100"),
    MaxRewrites = list_to_integer(MaxRewritesList),
    RewriteCount =
        case get(couch_rewrite_count) of
            undefined -> 0;
            Count -> Count
        end,
    ?LOG_INFO("rewrite recursion depth ~B/~B", [RewriteCount, MaxRewrites]),
    case RewriteCount of
        NumRewrites when NumRewrites < MaxRewrites ->
            put(couch_rewrite_count, NumRewrites + 1);
        _ ->
            throw({bad_request, <<"Exceeded rewrite recursion limit">>})
    end,

I noticed the problem immediately: CouchDB is reusing request processes, but not clearing
the couch_rewrite_count in the process dictionary!

Apache CouchDB has started. Time to relax.
[info] [<0.36.0>] Apache CouchDB has started on http://0.0.0.0:5984/
[info] [<0.36.0>] Apache CouchDB has started on https://0.0.0.0:6984/
[info] [<0.134.0>] rewrite recursion depth 0/100
[info] [<0.134.0>] 127.0.0.1 - - GET /testdb/testapp/apps/testapp.html 200
[info] [<0.134.0>] rewrite recursion depth 1/100
[info] [<0.134.0>] 127.0.0.1 - - GET /testdb/testapp/stylesheets/testapp/screen.css
200
[info] [<0.134.0>] rewrite recursion depth 2/100
[info] [<0.134.0>] 127.0.0.1 - - GET /testapp/_design/testapp/_list/image_json/images?_=1360958246705
200
[info] [<0.134.0>] rewrite recursion depth 3/100
[info] [<0.134.0>] 127.0.0.1 - - GET /testapp/396/images/1.jpg?key=396&file=1.jpg
200
[info] [<0.134.0>] rewrite recursion depth 4/100
[info] [<0.134.0>] 127.0.0.1 - - GET /testdb/testapp/apps/testapp.html 200
[info] [<0.134.0>] rewrite recursion depth 5/100
[info] [<0.134.0>] 127.0.0.1 - - GET /testdb/testapp/stylesheets/testapp/screen.css
304
[info] [<0.134.0>] rewrite recursion depth 6/100
[info] [<0.134.0>] 127.0.0.1 - - GET /testapp/_design/testapp/_list/image_json/images?_=1360958261344
200
[info] [<0.134.0>] rewrite recursion depth 7/100
[info] [<0.134.0>] 127.0.0.1 - - GET /testapp/_design/testapp/_list/value_json/all?startkey=%5B%5D&endkey=%5B%7B%7D%5D
304
[info] [<0.134.0>] rewrite recursion depth 8/100
[info] [<0.134.0>] 127.0.0.1 - - GET /testapp/245/images/1.jpg?key=245&file=1.jpg
200
[info] [<0.134.0>] rewrite recursion depth 9/100
[info] [<0.134.0>] 127.0.0.1 - - GET /testapp/389/images/2.jpg?key=389&file=2.jpg
200
[info] [<0.134.0>] rewrite recursion depth 10/100
[info] [<0.134.0>] 127.0.0.1 - - GET /testapp/389/images/1.jpg?key=389&file=1.jpg
200

A quick search through the codebase confirms this:

Searching 130 files for "couch_rewrite_count" (case sensitive)

couchdb/src/couchdb/couch_httpd_rewrite.erl:
  123      MaxRewritesList = couch_config:get("httpd", "rewrite_limit", "100"),
  124      MaxRewrites = list_to_integer(MaxRewritesList),
  125:     case get(couch_rewrite_count) of
  126          undefined ->
  127:             put(couch_rewrite_count, 1);
  128          NumRewrites when NumRewrites < MaxRewrites ->
  129:             put(couch_rewrite_count, NumRewrites + 1);
  130          _ ->
  131              throw({bad_request, <<"Exceeded rewrite recursion limit">>})

3 matches in 1 file
                
> Server responds 400 "Exceeded rewrite recursion limit" indefinitely
> -------------------------------------------------------------------
>
>                 Key: COUCHDB-1651
>                 URL: https://issues.apache.org/jira/browse/COUCHDB-1651
>             Project: CouchDB
>          Issue Type: Bug
>          Components: HTTP Interface
>            Reporter: Paul Frazee
>
> Running 1.2.1 on Windows 7 as a service.
> hosts file includes "127.0.0.1 grimwire.local"
> CouchDB conf includes vhosts entries:
> grimwire.local:5984	         /grimwire/_design/grimwire/_rewrite
> grimwire.local:5984/local	 /grimwire/_design/local/_rewrite
> 'grimwire' design doc rewrites:
> [
> 	{
> 		"from": "",
> 		"to": "index.html",
> 		"method": "GET"
> 	},
> 	{
> 		"from": "*",
> 		"to": "*"
> 	}
> ]
> 'local' design doc rewrites:
> [
> 	{
> 		"from":"",
> 		"to":"index.html",
> 		"method":"GET"
> 	},
> 	{
> 		"from":"/posts",
> 		"to":"_list/wallpost/wallpost-by-created_at",
> 		"method":"GET"
> 	},
> 	{
> 		"from":"/posts",
> 		"to":"_update/wallpost",
> 		"method":"POST"
> 	},
> 	{
> 		"from":"/posts/:id",
> 		"to":"_show/wallpost/:id",
> 		"method":"GET"
> 	},
> 	{
> 		"from":"/posts/:id",
> 		"to":"_update/wallpost/:id",
> 		"method":"PUT"
> 	},
> 	{
> 		"from":"*",
> 		"to":"*"
> 	}
> ]
> Problem:
> The requests work as expected for some unknown period, then begin to respond with a 400
status and the "Exceeded rewrite recursion limit" error message. Changing the rewrites rules
for both applications, including setting them to empty arrays, had no effect.
> The problem was solved by restarting the CouchDB service.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message