lib: Hold at most 10 outstanding paged result cookies
authorVolker Lendecke <vl@samba.org>
Mon, 7 May 2018 14:53:00 +0000 (16:53 +0200)
committerKarolin Seeger <kseeger@samba.org>
Fri, 28 Sep 2018 11:55:34 +0000 (13:55 +0200)
Bug: https://bugzilla.samba.org/show_bug.cgi?id=13362
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Tue May 15 09:37:21 CEST 2018 on sn-devel-144

(cherry picked from commit 9fbd4672b06de5333a9c44fc126b8edac0b9d31a)

Autobuild-User(v4-7-test): Karolin Seeger <kseeger@samba.org>
Autobuild-Date(v4-7-test): Fri Sep 28 13:55:34 CEST 2018 on sn-devel-144

lib/ldb/modules/paged_results.c

index aafbcbf448354445dd0366888fc22212de04d2ac..ecb22271d2818a849a1683efc559af99bb5bbc26 100644 (file)
@@ -36,6 +36,7 @@
 #include "system/filesys.h"
 #include "system/time.h"
 #include "dlinklist.h"
+#include <assert.h>
 #include "ldb_module.h"
 
 struct message_store {
@@ -68,6 +69,7 @@ struct results_store {
 
 struct private_data {
        uint32_t next_free_id;
+       size_t num_stores;
        struct results_store *store;
        
 };
@@ -76,6 +78,10 @@ static int store_destructor(struct results_store *del)
 {
        struct private_data *priv = del->priv;
        DLIST_REMOVE(priv->store, del);
+
+       assert(priv->num_stores > 0);
+       priv->num_stores -= 1;
+
        return 0;
 }
 
@@ -108,8 +114,21 @@ static struct results_store *new_store(struct private_data *priv)
 
        DLIST_ADD(priv->store, newr);
 
+       assert(priv->num_stores < SIZE_MAX);
+       priv->num_stores += 1;
+
        talloc_set_destructor(newr, store_destructor);
 
+       if (priv->num_stores > 10) {
+               struct results_store *last;
+               /*
+                * 10 is the default for MaxResultSetsPerConn --
+                * possibly need to parameterize it.
+                */
+               last = DLIST_TAIL(priv->store);
+               TALLOC_FREE(last);
+       }
+
        return newr;
 }
 
@@ -366,6 +385,8 @@ static int paged_search(struct ldb_module *module, struct ldb_request *req)
                        return LDB_ERR_UNWILLING_TO_PERFORM;
                }
 
+               DLIST_PROMOTE(private_data->store, current);
+
                ac->store = current;
 
                /* check if it is an abandon */
@@ -397,6 +418,7 @@ static int paged_request_init(struct ldb_module *module)
        }
 
        data->next_free_id = 1;
+       data->num_stores = 0;
        data->store = NULL;
        ldb_module_set_private(module, data);