Trivially reproduced with this Python script:

I wanted to get the PR out but I'm also going to try and contemplate how to 
test this a bit more directly.

```python
#!/usr/bin/env python

import base64
import json
import os
import random

import requests

S = requests.session()
S.auth = ("adm", "pwd")
S.headers["Content-Type"] = "application/json"
BASE = "http://127.0.0.1:15986/";
DB = BASE + "foo"
DDOC = DB + "/_design/bar"
VIEW = DDOC + "/_view/bam"
SIG = "1d2f27b7abd18837599f078927c7bc1f"


def gen_key():
    data = os.urandom(50)
    return base64.b64encode(data)


def gen_device():
    return {
        "tx_bytes": random.randint(1, 8192),
        "rx_bytes": random.randint(1, 8192)
    }


def gen_data():
    ret = {}
    for i in range(1024):
        ret[gen_key()] = gen_device()
    return ret


def load_docs():
    for i in range(25):
        print "Generating: %d - %d" % (i*100, (i+1)*100)
        docs = []
        for j in range(100):
            docs.append({
                "_id": "%06d" % ((i*100) + j),
                "data": gen_data()
            })
        body = json.dumps({"docs": docs})
        r = S.post(DB + "/_bulk_docs", data=body)
        r.raise_for_status()


def load_ddoc():
    ddoc = {
        "language": "javascript",
        "views": {
            "bam": {
                "map": """
                    function(doc) {
                        emit(doc._id, doc.data);
                    }""",
                #"reduce": "_sum"
                "reduce": """
                    function(keys, values) {
                        var obj = {};
                        for(var v in values) {
                            for(var k in values[v]) {
                                log(k);
                                obj[k] = values[v][k];
                            }
                        }
                        return obj;
                    }
                """
            }
        }
    }
    body = json.dumps(ddoc)
    r = S.put(DB + "/_design/bar", data=body)
    r.raise_for_status()


def get_size():
    fname = "dev/lib/node1/data/.foo_design/mrview/%s.view" % SIG
    return os.stat(fname).st_size


def get_task():
    r = S.get(BASE + "/_active_tasks")
    for t in r.json():
        return t

def main():
    S.delete(DB)
    r = S.put(DB)
    r.raise_for_status()
    load_docs()
    load_ddoc()

    r = S.get(VIEW, params={"limit": 0})
    r.raise_for_status()

    print "Initial build: %d" % get_size()

    r = S.post(DDOC + "/_compact")
    r.raise_for_status()

    print get_task()


if __name__ == "__main__":
    main()
```

[ Full content available at: https://github.com/apache/couchdb/pull/1574 ]
This message was relayed via gitbox.apache.org for [email protected]

Reply via email to