123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402 |
- /**
- * Tencent is pleased to support the open source community by making Tars available.
- *
- * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
- *
- * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * https://opensource.org/licenses/BSD-3-Clause
- *
- * Unless required by applicable law or agreed to in writing, software distributed
- * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- * CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
- #include "util/tc_hashmap.h"
- #include "util/tc_common.h"
- #include "util/tc_shm.h"
- #include "util/tc_option.h"
- #include <stdlib.h>
- #include <iostream>
- using namespace tars;
- ////////////////////////////////////////////////////////////////////
- //
- TC_Shm g_shm;
- TC_HashMap g_hmap;
- vector<pair<string, string> > prepare()
- {
- cout << "start pareparing data" << endl;
- size_t count = 10000;
- vector<pair<string, string> > v;
- vector<string> vs;
- vs.push_back("a");
- vs.push_back("ab");
- vs.push_back("abc");
- vs.push_back("abcd");
- vs.push_back("abcde");
- vs.push_back("abcdef");
- vs.push_back("abcdefg");
- vs.push_back("abcdefgh");
- vs.push_back("abcdefghi");
- vs.push_back("abcdefghij");
- vs.push_back("abcdefghijk");
- vs.push_back("abcdefghijkl");
- vs.push_back("abcdefghijklm");
- srand(time(NULL));
- for(size_t i = 0; i < count; i++)
- {
- pair<string, string> data;
- ostringstream s;
- s << i << "_" << rand();
- data.first = s.str() + "_" + vs[rand() % vs.size()];
- data.second = s.str() + "_" + vs[rand() % vs.size()];
- v.push_back(data);
- }
- cout << "pareparing data OK:" << v.size() << endl;
- return v;
- }
- void initMem()
- {
- size_t iMemSize = 1024*10;
- g_shm.init(iMemSize, 8888);
- }
- void initMap()
- {
- if (g_shm.iscreate())
- {
- size_t iAvgSize = 10;
- g_hmap.initDataBlockSize(iAvgSize, iAvgSize, 1.0);
- g_hmap.create(g_shm.getPointer(), g_shm.size());
- g_hmap.setEraseCount(3);
- }
- else
- {
- g_hmap.connect(g_shm.getPointer(), g_shm.size());
- }
- cout << "init mem" << endl;
- }
- void testSendRand()
- {
- vector<pair<string, string> > v = prepare();
- vector<TC_HashMap::BlockData> vRecords;
- for(int i = 0; i < 10000; i++)
- {
- size_t index = rand() % v.size();
- ostringstream s;
- s << i ;
- v[index].first = s.str();
- v[index].second = s.str();
- cout << "set:" << v[index].first << ":" << v[index].second << ":" << g_hmap.size() << ":" << g_hmap.dirtyCount() << endl;
- int ret = g_hmap.set(v[index].first, v[index].second, true, vRecords);
- assert(ret == 0);
- }
- cout << g_hmap.size() << "|" << g_hmap.dirtyCount() << endl;
- }
- void testGetRand()
- {
- vector<pair<string, string> > v = prepare();
- for(int i = 0; i < 200000; i++)
- {
- size_t index = rand() % v.size();
- time_t iSyncTime;
- int ret = g_hmap.get(v[index].first, v[index].second, iSyncTime);
- assert(ret == 0);
- cout << "get:" << v[index].first << ":" << v[index].second << ":" << g_hmap.size() << ":" << g_hmap.dirtyCount() << endl;
- }
- cout << g_hmap.size() << "|" << g_hmap.dirtyCount() << endl;
- }
- void usage(char *argv)
- {
- cout << argv << " --help" << endl;
- cout << "\t --release" << endl;
- cout << "\t --view" << endl;
- cout << "\t --sync [--count=]" << endl;
- cout << "\t --set-rand" << endl;
- cout << "\t --set-tars [--key=] [--value=]" << endl;
- cout << "\t --del [--key=]" << endl;
- cout << "\t --get [--key=]" << endl;
- cout << "\t --get-rand" << endl;
- cout << "\t --erase [--key=]" << endl;
- cout << "\t --isdirty [--key=]" << endl;
- cout << "\t --find [--key=]" << endl;
- cout << "\t --listh [--asc]" << endl;
- cout << "\t --listt [--asc]" << endl;
- cout << "\t --listg [--asc]" << endl;
- cout << "\t --listd" << endl;
- }
- int main(int argc, char *argv[])
- {
- {
- TC_Option option;
- option.decode(argc, argv);
- map<string, string> m = option.getMulti();
- if(option.hasParam("help") || option.getMulti().empty())
- {
- usage(argv[0]);
- return 0;
- }
- initMem();
- if(option.hasParam("release"))
- {
- g_shm.del();
- return 0;
- }
- initMap();
- /*
- fork();
- fork();
- fork();
- */
- if(option.hasParam("set-rand"))
- {
- testSendRand();
- }
- else if(option.hasParam("set-tars"))
- {
- vector<TC_HashMap::BlockData> vRecords;
- string k;
- string v;
- k = option.getValue("key");
- v = option.getValue("value");
- int ret = g_hmap.set(k, v, true, vRecords);
- assert(ret == 0);
- cout << "set-tars:" << k << ":" << v << " ret=" << ret << endl;
- for(size_t i = 0; i < vRecords.size(); i++)
- {
- cout << "set-tars erase:" << vRecords[i]._key << ":" << vRecords[i]._value << endl;
- }
- }
- else if(option.hasParam("get-rand"))
- {
- testGetRand();
- }
- else if(option.hasParam("del"))
- {
- TC_HashMap::BlockData stRecord;
- string k;
- k = option.getValue("key");
- int ret = g_hmap.del(k, stRecord);
- cout << "del:" << k << " ret=" << ret << endl;
- cout << "del:" << stRecord._key << endl;
- }
- else if(option.hasParam("get"))
- {
- string k;
- string v;
- k = option.getValue("key");
- time_t iSyncTime;
- int ret = g_hmap.get(k, v, iSyncTime);
- cout << "get:" << k << ":" << v << " ret=" << ret << endl;
- }
- else if(option.hasParam("erase"))
- {
- int ratio = TC_Common::strto<int>(option.getValue("ratio"));
- TC_HashMap::BlockData data;
- int ret = TC_HashMap::RT_OK;
- do
- {
- ret = g_hmap.erase(ratio, data, true);
- cout << "erase: " << data._key << "|" << data._value << "|ret:" << ret << endl;
- }while(/*ret == TC_HashMap::RT_ERASE_OK*/false);
- }
- else if(option.hasParam("set-dirty"))
- {
- string k = option.getValue("key");
- int ret = g_hmap.setDirty(k);
- cout << "set-dirty: " << k << "|" << ret << endl;
- }
- else if(option.hasParam("set-clean"))
- {
- string k = option.getValue("key");
- int ret = g_hmap.setClean(k);
- cout << "set-clean: " << k << "|" << ret << endl;
- }
- else if(option.hasParam("isdirty"))
- {
- string k;
- k = option.getValue("key");
- int ret = g_hmap.checkDirty(k);
- cout << "isdirty:" << k << " ret=" << ret << endl;
- }
- else if(option.hasParam("find"))
- {
- string k;
- k = option.getValue("key");
- TC_HashMap::lock_iterator it = g_hmap.find(k);
- if(it != g_hmap.end())
- {
- string v;
- int ret = it->get(k, v);
- if(ret != TC_HashMap::RT_OK)
- {
- cout << "get error: ret=" << ret << endl;
- }
- else
- {
- cout << "find ok:" << k << " value=" << v << endl;
- }
- }
- else
- {
- cout << "find none:" << k << endl;
- }
- }
- else if(option.hasParam("sync"))
- {
- TC_HashMap::BlockData data;
- // size_t n = atoi(option.getValue("count").c_str());
- size_t n = 0;
- while(true)
- {
- int ret = g_hmap.sync(time(NULL), data);
- if (ret == TC_HashMap::RT_OK)
- {
- break;
- }
- else
- {
- ++n;
- cout << "sync:" << data._key << endl;
- }
- }
- cout << g_hmap.desc() << endl;
- }
- else if(option.hasParam("view"))
- {
- cout << g_hmap.desc() << endl;
- }
- else if(option.hasParam("listh"))
- {
- TC_HashMap::lock_iterator it;
- if(option.hasParam("asc"))
- {
- it = g_hmap.begin();
- }
- else
- {
- it = g_hmap.rbegin();
- }
- while(it != g_hmap.end())
- {
- string k;
- string v;
- it->get(k, v);
- ++it;
- // usleep(100000);
- cout << k << ":" << v << endl;
- }
- }
- else if(option.hasParam("listd"))
- {
- TC_HashMap::lock_iterator it = g_hmap.beginDirty();
- while(it != g_hmap.end())
- {
- string k;
- string v;
- it->get(k, v);
- it++;
- // usleep(100000);
- cout << k << ":" << v << endl;
- }
- }
- else if(option.hasParam("listt"))
- {
- TC_HashMap::lock_iterator it;
- if(option.hasParam("asc"))
- {
- it = g_hmap.beginSetTime();
- }
- else
- {
- it = g_hmap.rbeginSetTime();
- }
- while(it != g_hmap.end())
- {
- string k;
- string v;
- it->get(k, v);
- ++it;
- // usleep(100000);
- cout << k << ":" << v << endl;
- }
- }
- else if(option.hasParam("listg"))
- {
- TC_HashMap::lock_iterator it;
-
- if(option.hasParam("asc"))
- {
- it = g_hmap.beginGetTime();
- }
- else
- {
- it = g_hmap.rbeginGetTime();
- }
-
- while(it != g_hmap.end())
- {
- string k;
- string v;
-
- it->get(k, v);
- ++it;
-
- cout << k << ":" << v << endl;
- }
- }
- else
- {
- usage(argv[0]);
- }
- }
- return 0;
- }
|