diff options
Diffstat (limited to 'ctdb/server/ctdb_call.c')
-rw-r--r-- | ctdb/server/ctdb_call.c | 20 |
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)); } |