int64_t ClusterMigrate::move_range(const std::string &max_key, std::string *moved_max_key, int num_keys){ // get key range std::vector<std::string> keys; ssdb::Status s; // 从 "" 开始遍历, 是因为在中断之后, 重新执行时, 之前被中断了的数据是可以被迁移的. s = src->keys("", max_key, num_keys, &keys); if(!s.ok()){ log_error("response error: %s", s.code().c_str()); return -1; } if(keys.empty()){ return 0; } *moved_max_key = keys[keys.size() - 1]; KeyRange new_src_range(*moved_max_key, max_key); log_info("new src: %s", new_src_range.str().c_str()); s = src->set_kv_range(*moved_max_key, max_key); if(!s.ok()){ log_error("src server set_kv_range error! %s", s.code().c_str()); return -1; } int64_t bytes = 0; while(1){ // move key range for(int i=0; i<(int)keys.size(); i++){ const std::string &key = keys[i]; int ret = move_key(key); if(ret == -1){ log_error("move key %s error! %s", key.c_str(), s.code().c_str()); return -1; } bytes += ret; } keys.clear(); s = src->keys("", *moved_max_key, num_keys, &keys); if(!s.ok()){ log_error("response error: %s", s.code().c_str()); return -1; } if(keys.empty()){ break; } } return bytes; }
int move_range(const std::string &min_key, const std::string &max_key, int limit, std::string *moved_max_key){ // get key range std::vector<std::string> keys; ssdb::Status s; s = src->keys(min_key, max_key, limit, &keys); if(!s.ok()){ log_error("response error: %s", s.code().c_str()); return -1; } if(keys.empty()){ return 0; } if(moved_max_key){ *moved_max_key = keys[keys.size() - 1]; // lock key range log_info("lock range %s", KeyRange(min_key, *moved_max_key).str().c_str()); const std::vector<std::string>* resp; resp = src->request("set_kv_range", *moved_max_key, max_key); if(!resp || resp->empty() || resp->at(0) != "ok"){ log_error("src server set_kv_range error!"); return -1; } } // move key range for(int i=0; i<(int)keys.size(); i++){ const std::string &key = keys[i]; if(move_key(key) == -1){ log_fatal("move key %s error! %s", key.c_str(), s.code().c_str()); exit(1); } } return (int)keys.size(); }
static t_unicode *type_one_key(t_unicode *in) { int esc, keynum; t_unicode ch; t_unicode keysym; static char ctrl[]="JMGHLIK"; stroke_pause = default_stroke_pause; if (!in || !in[0]) return 0; ch=*(in++); switch(ch) { case '\\': { ch=(*in++); if (!ch) return 0; esc = -1; switch(ch) { case 'v': esc++; case 't': esc++; case 'f': esc++; case 'b': esc++; case 'a': esc++; case 'r': esc++; case 'n': esc++; case '^': { /* example: \a == \^G == <Ctrl>G \r == \^M == <Ctrl>M == <ENTER> */ if (esc >= 0) ch = ctrl[esc]; else ch = *(in++); keysym = ch; if (keysym != KEY_VOID) { if (keysym == KEY_M) { put_symbol(PRESS, KEY_RETURN); put_symbol(RELEASE, KEY_RETURN); } else { put_modified_symbol(PRESS, MODIFIER_CTRL, keysym); put_modified_symbol(RELEASE, MODIFIER_CTRL, keysym); } } return in; } case 'A': { /* example: \Az == <Alt>z */ ch = *(in++); keysym = ch; if (keysym != KEY_VOID) { put_modified_symbol(PRESS, MODIFIER_ALT, keysym); put_modified_symbol(RELEASE, MODIFIER_ALT, keysym); } return in; } case 'F': { /* example: \F12; == key F12 \F1; == key F1 */ keynum = GETNUMBER(in); if ((keynum > 0) && (keynum < 12)) { keysym = KEY_F1 + keynum -1; put_symbol(PRESS, keysym); /* key pressed */ put_symbol(RELEASE, keysym); /* key released */ } return in; } case 'p': { /* example: \p100; == pause one second */ keynum = GETNUMBER(in); if ((keynum > 0) && (keynum < 10000)) { stroke_pause = keynum; } return in; } case 'P': { /* example: \P15; == set rate to 100/15 cps */ keynum = GETNUMBER(in); if (keynum > 0) { keynum--; if (keynum > 100) keynum = 100; default_stroke_pause = keynum; } return in; } case 'M': { /* 'M' == as in Move, ('P' would be nicer (Pu for PageUp) but is already used...) example: \Mh == <HOME> \Mu == <PageUp> \Me == <END> \Md == <PageDown> \M8 == <ArrowUp> \M4 == <ArrowLeft> \M6 == <ArrowRight> \M2 == <ArrowDown> */ ch=*(in++); switch(ch) { case 'i': keynum = KEY_INS; break; /* KEY_INS */ case 'h': keynum = KEY_HOME; break; /* KEY_HOME */ case 'u': keynum = KEY_PGUP; break; /* KEY_PGUP */ case 'c': keynum = KEY_DEL; break; /* KEY_DEL */ case 'e': keynum = KEY_END; break; /* KEY_END */ case 'd': keynum = KEY_PGDN; break; /* KEY_PGDN */ case '8': keynum = KEY_UP; break; /* KEY_UP */ case '4': keynum = KEY_LEFT; break; /* KEY_LEFT */ case '6': keynum = KEY_RIGHT; break; /* KEY_RIGHT */ case '2': default: keynum = KEY_DOWN; break; /* KEY_DOWN */ } move_key(PRESS, keynum); move_key(RELEASE, keynum); return in; } default: ; /* fall through */ } } default: { keysym = ch; if (keysym != KEY_VOID) { put_symbol(PRESS, keysym); /* key pressed */ put_symbol(RELEASE, keysym); /* key release */ } return in; } } return in; }