dsdb: Expose ldb error string to dsdb_garbage_collect_tombstones() callers
authorAndrew Bartlett <abartlet@samba.org>
Mon, 29 Aug 2016 22:22:47 +0000 (10:22 +1200)
committerGarming Sam <garming@samba.org>
Thu, 1 Sep 2016 03:49:15 +0000 (05:49 +0200)
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
source4/dsdb/kcc/garbage_collect_tombstones.c
source4/dsdb/kcc/garbage_collect_tombstones.h
source4/dsdb/kcc/kcc_periodic.c
source4/dsdb/pydsdb.c

index 7c3d3545ab68cabbcd29e6acab6608ea30711ceb..a04f5f5e8e4b6c47d28d7c8ad4e72ce963709de3 100644 (file)
@@ -40,7 +40,8 @@ NTSTATUS dsdb_garbage_collect_tombstones(TALLOC_CTX *mem_ctx,
                                         time_t current_time,
                                         uint32_t tombstoneLifetime,
                                         unsigned int *num_objects_removed,
-                                        unsigned int *num_links_removed)
+                                        unsigned int *num_links_removed,
+                                        char **error_string)
 {
        int ret;
 
@@ -57,7 +58,7 @@ NTSTATUS dsdb_garbage_collect_tombstones(TALLOC_CTX *mem_ctx,
 
        *num_objects_removed = 0;
        *num_links_removed = 0;
-
+       *error_string = NULL;
        num_link_attrs = 0;
 
        /*
@@ -132,8 +133,9 @@ NTSTATUS dsdb_garbage_collect_tombstones(TALLOC_CTX *mem_ctx,
                                  attrs, flags, filter);
 
                if (ret != LDB_SUCCESS) {
-                       DEBUG(1,(__location__ ": Failed to search for deleted objects in %s\n",
-                                ldb_dn_get_linearized(do_dn)));
+                       *error_string = talloc_asprintf(mem_ctx, "Failed to search for deleted objects in %s: %s",
+                                                       ldb_dn_get_linearized(do_dn),
+                                                       ldb_errstring(samdb));
                        TALLOC_FREE(tmp_ctx);
                        return NT_STATUS_INTERNAL_ERROR;
                }
index a921909ffcb1ca583e0ecbc609bcbb9d53143ecf..ce62f5dcfb04686d2b2a3a1c2987ec2d6e77aea7 100644 (file)
@@ -30,4 +30,5 @@ NTSTATUS dsdb_garbage_collect_tombstones(TALLOC_CTX *mem_ctx,
                                         time_t current_time,
                                         uint32_t tombstoneLifetime,
                                         unsigned int *num_objects_removed,
-                                        unsigned int *num_links_removed);
+                                        unsigned int *num_links_removed,
+                                        char **error_string);
index fd759f542093fb04d95a4710bee889b1b2a48e8c..8c4b70a1c94fe1a846c80dc2447aef25bb355ca4 100644 (file)
@@ -609,6 +609,7 @@ static NTSTATUS kccsrv_check_deleted(struct kccsrv_service *s, TALLOC_CTX *mem_c
        unsigned int num_objects_removed = 0;
        unsigned int num_links_removed = 0;
        NTSTATUS status;
+       char *error_string = NULL;
 
        if (current_time - s->last_deleted_check < interval) {
                return NT_STATUS_OK;
@@ -626,7 +627,8 @@ static NTSTATUS kccsrv_check_deleted(struct kccsrv_service *s, TALLOC_CTX *mem_c
                                                 s->partitions,
                                                 current_time, tombstoneLifetime,
                                                 &num_objects_removed,
-                                                &num_links_removed);
+                                                &num_links_removed,
+                                                &error_string);
 
        if (NT_STATUS_IS_OK(status)) {
                DEBUG(5, ("garbage_collect_tombstones: Removed %u tombstone objects "
@@ -637,7 +639,7 @@ static NTSTATUS kccsrv_check_deleted(struct kccsrv_service *s, TALLOC_CTX *mem_c
                          "objects and links after removing %u tombstone objects "
                          "and %u tombstone links successfully: %s\n",
                          num_objects_removed, num_links_removed,
-                         nt_errstr(status)));
+                         error_string ? error_string : nt_errstr(status)));
        }
        return status;
 }
index 0df52ad5f24e0a2df08c21fbab9a21bdb2b689ed..e53a24531defef83a466e08fbf0d746676cc9366 100644 (file)
@@ -1092,6 +1092,7 @@ static PyObject *py_dsdb_garbage_collect_tombstones(PyObject *self, PyObject *ar
        NTSTATUS status;
        unsigned int num_objects_removed = 0;
        unsigned int num_links_removed = 0;
+       char *error_string = NULL;
 
        if (!PyArg_ParseTuple(args, "OOL|L", &py_ldb,
                              &py_list_dn, &_current_time, &_tombstone_lifetime)) {
@@ -1156,10 +1157,16 @@ static PyObject *py_dsdb_garbage_collect_tombstones(PyObject *self, PyObject *ar
                                                 part, current_time,
                                                 tombstone_lifetime,
                                                 &num_objects_removed,
-                                                &num_links_removed);
+                                                &num_links_removed,
+                                                &error_string);
 
        if (!NT_STATUS_IS_OK(status)) {
-               PyErr_SetNTSTATUS(status);
+               if (error_string) {
+                       PyErr_Format(PyExc_RuntimeError, "%s", error_string);
+               } else {
+                       PyErr_SetNTSTATUS(status);
+               }
+               TALLOC_FREE(mem_ctx);
                return NULL;
        }