summaryrefslogtreecommitdiff
path: root/ctdb/server/ctdb_call.c
diff options
context:
space:
mode:
Diffstat (limited to 'ctdb/server/ctdb_call.c')
-rw-r--r--ctdb/server/ctdb_call.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/ctdb/server/ctdb_call.c b/ctdb/server/ctdb_call.c
index c015fbfff66..dabfe5468f8 100644
--- a/ctdb/server/ctdb_call.c
+++ b/ctdb/server/ctdb_call.c
@@ -338,7 +338,7 @@ static void ctdb_become_dmaster(struct ctdb_db_context *ctdb_db,
return;
}
- ctdb_call_local(ctdb_db, state->call, &header, state, &data, true);
+ ctdb_call_local(ctdb_db, state->call, &header, state, &data, true, ctdb->pnn);
ret = ctdb_ltdb_unlock(ctdb_db, state->call->key);
if (ret != 0) {
@@ -643,11 +643,15 @@ void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
CTDB_INCREMENT_DB_STAT(ctdb_db, hop_count_bucket[bucket]);
- /* Try if possible to migrate the record off to the caller node.
- * From the clients perspective a fetch of the data is just as
- * expensive as a migration.
- */
- if (c->hdr.srcnode != ctdb->pnn) {
+ /* if this nodes has done enough consecutive calls on the same record
+ then give them the record
+ or if the node requested an immediate migration
+ */
+ if ( c->hdr.srcnode != ctdb->pnn &&
+ ((header.laccessor == c->hdr.srcnode
+ && header.lacount >= ctdb->tunable.max_lacount
+ && ctdb->tunable.max_lacount != 0)
+ || (c->flags & CTDB_IMMEDIATE_MIGRATION)) ) {
if (ctdb_db->transaction_active) {
DEBUG(DEBUG_INFO, (__location__ " refusing migration"
" of key %s while transaction is active\n",
@@ -666,7 +670,7 @@ void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
}
}
- ret = ctdb_call_local(ctdb_db, call, &header, hdr, &data, true);
+ ret = ctdb_call_local(ctdb_db, call, &header, hdr, &data, true, c->hdr.srcnode);
if (ret != 0) {
DEBUG(DEBUG_ERR,(__location__ " ctdb_call_local failed\n"));
call->status = -1;
@@ -953,7 +957,7 @@ struct ctdb_call_state *ctdb_call_local_send(struct ctdb_db_context *ctdb_db,
*(state->call) = *call;
state->ctdb_db = ctdb_db;
- ret = ctdb_call_local(ctdb_db, state->call, header, state, data, true);
+ ret = ctdb_call_local(ctdb_db, state->call, header, state, data, true, ctdb->pnn);
if (ret != 0) {
DEBUG(DEBUG_DEBUG,("ctdb_call_local() failed, ignoring return code %d\n", ret));
}