From 293a684e92cfe3db9a11497ed6da1b5a2be063ce Mon Sep 17 00:00:00 2001
From: Rich Prohaska <prohaska@tokutek.com>
Date: Mon, 14 Oct 2013 14:32:35 -0400
Subject: [PATCH] #87 add callback to allow loader memory size to be a session
 variable

---
 buildheader/make_tdb.cc        | 2 +-
 src/loader.cc                  | 6 +++---
 src/tests/env_loader_memory.cc | 9 ++++++++-
 src/ydb-internal.h             | 2 +-
 src/ydb.cc                     | 9 ++++++---
 5 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/buildheader/make_tdb.cc b/buildheader/make_tdb.cc
index 9b279aa6095..dfa17bdecda 100644
--- a/buildheader/make_tdb.cc
+++ b/buildheader/make_tdb.cc
@@ -459,7 +459,7 @@ static void print_db_env_struct (void) {
                              "void (*change_fsync_log_period)             (DB_ENV*, uint32_t)",
                              "int (*iterate_live_transactions)            (DB_ENV *env, iterate_transactions_callback callback, void *extra)",
                              "int (*iterate_pending_lock_requests)        (DB_ENV *env, iterate_requests_callback callback, void *extra)",
-                             "void (*set_loader_memory_size)(DB_ENV *env, uint64_t loader_memory_size)",
+                             "void (*set_loader_memory_size)(DB_ENV *env, uint64_t (*get_loader_memory_size_callback)(void))",
                              "uint64_t (*get_loader_memory_size)(DB_ENV *env)",
                              NULL};
 
diff --git a/src/loader.cc b/src/loader.cc
index 57beee3810f..93ac551632e 100644
--- a/src/loader.cc
+++ b/src/loader.cc
@@ -319,8 +319,8 @@ toku_loader_create_loader(DB_ENV *env,
         }
         TOKUTXN ttxn = txn ? db_txn_struct_i(txn)->tokutxn : NULL;
         rval = toku_ft_loader_open(&loader->i->ft_loader,
-                                 loader->i->env->i->cachetable,
-                                 loader->i->env->i->generate_row_for_put,
+                                 env->i->cachetable,
+                                 env->i->generate_row_for_put,
                                  src_db,
                                  N,
                                  brts, dbs,
@@ -330,7 +330,7 @@ toku_loader_create_loader(DB_ENV *env,
                                  load_lsn,
                                  ttxn,
                                  puts_allowed,
-                                 loader->i->env->i->loader_memory_size,
+                                 env->get_loader_memory_size(env),
                                  compress_intermediates);
         if ( rval!=0 ) {
             toku_free(new_inames_in_env);
diff --git a/src/tests/env_loader_memory.cc b/src/tests/env_loader_memory.cc
index 1cbdc1b16f5..106bdefd3a9 100644
--- a/src/tests/env_loader_memory.cc
+++ b/src/tests/env_loader_memory.cc
@@ -91,14 +91,21 @@ PATENT RIGHTS GRANT:
 #include "test.h"
 #include <db.h>
 
+static uint64_t my_loader_memory_size;
+
+static uint64_t get_loader_memory_size(void) {
+    return my_loader_memory_size;
+}
+
 int test_main (int argc, char * const argv[]) {
     parse_args(argc, argv);
     int r;
     DB_ENV *env;
     r = db_env_create(&env, 0);
     assert_zero(r);
+    env->set_loader_memory_size(env, get_loader_memory_size);
     for (uint64_t n = 0 ; n < 10000000000; n += 1000000000) {
-        env->set_loader_memory_size(env, n);
+        my_loader_memory_size = n;
         assert(env->get_loader_memory_size(env) == n);
     }
     r = env->close(env, 0);
diff --git a/src/ydb-internal.h b/src/ydb-internal.h
index fe1113d2c0d..bcb3d63badc 100644
--- a/src/ydb-internal.h
+++ b/src/ydb-internal.h
@@ -182,7 +182,7 @@ struct __toku_db_env_internal {
     int datadir_lockfd;
     int logdir_lockfd;
     int tmpdir_lockfd;
-    uint64_t loader_memory_size;
+    uint64_t (*get_loader_memory_size_callback)(void);
 };
 
 // test-only environment function for running lock escalation
diff --git a/src/ydb.cc b/src/ydb.cc
index dc8ec6c7ffa..4bb2e37c193 100644
--- a/src/ydb.cc
+++ b/src/ydb.cc
@@ -2416,12 +2416,15 @@ env_iterate_live_transactions(DB_ENV *env,
     return toku_txn_manager_iter_over_live_root_txns(txn_manager, iter_txns_callback, &e);
 }
 
-static void env_set_loader_memory_size(DB_ENV *env, uint64_t loader_memory_size) {
-    env->i->loader_memory_size = loader_memory_size;
+static void env_set_loader_memory_size(DB_ENV *env, uint64_t (*get_loader_memory_size_callback)(void)) {
+    env->i->get_loader_memory_size_callback = get_loader_memory_size_callback;
 }
 
 static uint64_t env_get_loader_memory_size(DB_ENV *env) {
-    return env->i->loader_memory_size;
+    uint64_t memory_size = 0;
+    if (env->i->get_loader_memory_size_callback)
+        memory_size = env->i->get_loader_memory_size_callback();
+    return memory_size;
 }
 
 static int 
-- 
GitLab