can anyone make it at server side? i don't know anything about server side source code (yet)
2011/2/4 Adam Lee <a...@fotolog.biz>: > awl > > On Feb 3, 2011 11:11 PM, "Roberto Spadim" <robe...@spadim.com.br> wrote: >> not identical... if you need less network latency, server side is >> better... no doubt... >> like CAS we could make a LOCK system (just LOCK/UNLOCK, with timeout, >> and just allow change lock/unlock if content of lock = content value >> sent on memcache client) >> >> 2011/2/3 Adam Lee <a...@fotolog.biz>: >>> I'm not sure what you mean that it's "client-based." Sure, the logic is >>> on >>> the client, as a lot of things are with memcached, but the CAS is >>> enforced >>> by the server. Doesn't seem like it's functionally any different than >>> adding the same function on the server side, since the client would just >>> be >>> interpreting the new feature in the protocol instead, but functionally it >>> would work out to be identical, I believe... >>> >>> On Thu, Feb 3, 2011 at 2:49 PM, Roberto Spadim <robe...@spadim.com.br> >>> wrote: >>>> >>>> ok, but it´s client based... >>>> i want a server based (memcache daemon) >>>> >>>> at client side: >>>> memcached_lock("lock_name",1); >>>> memcached_lock("lock_name",0); >>>> >>>> at server side: >>>> lock/unlock some variable (maybe a server based flock()) >>>> since we use ram memory we could use ram locks (not filesystem lock) >>>> with repcache we can replicate this lock on replicas.... >>>> >>>> >>>> 2011/2/3 Adam Lee <a...@fotolog.biz>: >>>> > Here's one I hacked together a while back, though, as I said before, I >>>> > recommend using something better suited to the job... BTW, this thing >>>> > uses >>>> > a few of our utility classes, but it should be very simple to drop in >>>> > replacements. >>>> > public class GlobalLock >>>> > { >>>> > public GlobalLock(String lockType, String resourceId) >>>> > { >>>> > if (StringUtils.isBlank(lockType)) >>>> > throw new NullPointerException("Empty lock type"); >>>> > if (StringUtils.isBlank(resourceId)) >>>> > throw new NullPointerException("Empty resource id"); >>>> > _globalId = StringUtil.toHexString((lockType + >>>> > resourceId).getBytes()) +":GlobalLock"; >>>> > while(_value == 0) >>>> > _value = RandomUtils.nextLong(); >>>> > _acquired = false; >>>> > } >>>> > public GlobalLock lock() >>>> > { >>>> > if (_acquired) >>>> > return this; >>>> > // Lock duration 20sec >>>> > // tries to acquire lock for 21sec >>>> > // obviously this is a far from perfect hack >>>> > final int LOCK_DURATION_SECS = 20; >>>> > final int SLEEP_TIME_MILLIS = 100; >>>> > final int MAX_TRIES = 210; // max number of attempts to >>>> > acquire >>>> > lock >>>> > MemcachedClient mc = FotologMemCache.getFotolog(); >>>> > for(int numTries = 0; numTries < MAX_TRIES; numTries++) >>>> > { >>>> > if (_log.isInfoEnabled()) _log.info("locking "+_globalId); >>>> > try >>>> > { >>>> > CASValue<Object> mcVal = mc.gets(_globalId); >>>> > if (mcVal == null) >>>> > { >>>> > _acquired = mc.add(_globalId, LOCK_DURATION_SECS, >>>> > _value).get(); >>>> > } >>>> > else if ( ((Long)mcVal.getValue()).longValue() == 0 ) >>>> > { >>>> > CASResponse casResp = mc.cas(_globalId, >>>> > mcVal.getCas(), >>>> > _value); >>>> > _acquired = (casResp == CASResponse.OK); >>>> > } >>>> > else >>>> > { >>>> > if (_log.isInfoEnabled()) _log.info("waiting for >>>> > another >>>> > process to finish: "+_globalId + ":" + mcVal.getValue()); >>>> > } >>>> > } >>>> > catch (Exception e) >>>> > { >>>> > _log.error(e.getMessage()); >>>> > } >>>> > if (_acquired) >>>> > return this; >>>> > try { Thread.sleep(SLEEP_TIME_MILLIS); } catch >>>> > (InterruptedException ie) {/**/} // don't 'busywait' >>>> > } >>>> > throw new GlobalLockException("Unable to lock [" + _globalId + >>>> > "] >>>> > after " + MAX_TRIES + " attempts"); >>>> > } >>>> > >>>> > /** Unlocks ALL of the resources locked with lock(). >>>> > * Never fails, so doesn't require additional try/catch if you are >>>> > calling it from some other 'finally' >>>> > */ >>>> > public void unlock() >>>> > { >>>> > if (_acquired) >>>> > { >>>> > _acquired = false; >>>> > MemcachedClient mc = FotologMemCache.getFotolog(); >>>> > CASValue<Object> mcVal = mc.gets(_globalId); >>>> > if (mcVal == null) >>>> > { >>>> > // nothing to do, val already expired >>>> > if (_log.isInfoEnabled()) _log.info("already expired: >>>> > " >>>> > + >>>> > _globalId + ":" + _value); >>>> > return; >>>> > } >>>> > else if ( ((Long)mcVal.getValue()).longValue() == _value ) >>>> > { >>>> > mc.cas(_globalId, mcVal.getCas(), 0l); // reset but >>>> > only >>>> > if >>>> > it matches our val >>>> > } >>>> > else >>>> > { >>>> > _log.error("failed to unlock: " + _globalId + ":" + >>>> > _value); >>>> > } >>>> > } >>>> > } >>>> > >>>> > private static Logger _log = Logger.getLogger(GlobalLock.class); >>>> > private String _globalId; >>>> > private long _value; >>>> > private boolean _acquired; >>>> > } >>>> > On Tue, Feb 1, 2011 at 1:40 PM, Roberto Spadim <robe...@spadim.com.br> >>>> > wrote: >>>> >> >>>> >> LOCK should be something like this: >>>> >> >>>> >> <?php >>>> >> // type=0 -> unlock >>>> >> // type=1 -> lock >>>> >> // client_name must change (use sessionID + username) >>>> >> function >>>> >> >>>> >> memcache_flock($memcache_obj,$key,$type=0,$client_name='1',$timeout=0){ >>>> >> >>>> >> $ret=memcache_add($memcache_obj,$key,$client_name,false,$timeout); >>>> >> if($ret==true){ >>>> >> if($type==0) // delete >>>> >> memcache_del($memcache_obj,$key); >>>> >> return(true); >>>> >> } >>>> >> $cur_cli=memcache_get($memcache_obj,$key); >>>> >> if(is_string($cur_cli) && $cur_cli!=''){ // if ='' no user! >>>> >> if($cur_cli !== $client_name){ >>>> >> // it's not our lock >>>> >> if(check_user_online_function()) // http >>>> >> session >>>> >> function (if want >>>> >> http session integration), for memcached it´s like (true) >>>> >> return($cur_cli); // return >>>> >> current >>>> >> lock client_name >>>> >> } >>>> >> // our lock! >>>> >> }else{ >>>> >> // replace, autocorrect a wrong usage >>>> >> memcache_replace($memcache_obj, $key, $client_name, >>>> >> false, >>>> >> $timeout); >>>> >> } >>>> >> if($type==0) // delete? >>>> >> memcache_del($memcache_obj,$key); >>>> >> return(true); >>>> >> } >>>> >> ?> >>>> >> >>>> >> >>>> >> >>>> >> >>>> >> 2011/2/1 Adam Lee <a...@fotolog.biz>: >>>> >> > there are some excellent solutions out there already. check out, >>>> >> > for >>>> >> > example, zookeeper. >>>> >> > >>>> >> > awl >>>> >> > >>>> >> > On Jan 29, 2011 3:32 PM, "rspadim" <rspa...@gmail.com> wrote: >>>> >> >> hi guys, there's a async replication project (repcached) that is >>>> >> >> very >>>> >> >> interesting, could we implement it in main source code? at compile >>>> >> >> time we could select from repcached or memcached >>>> >> >> could we make it sync and/or async? >>>> >> >> http://repcached.sourceforge.net/ >>>> >> >> >>>> >> >> >>>> >> >> >>>> >> >> >>>> >> >> ================================================================================= >>>> >> >> there's some non volatile solutions too that's very interesting >>>> >> >> (memcachedb), for low memory computers we can use disk >>>> >> >> could we implement it in main source code too? >>>> >> >> http://memcachedb.org/ >>>> >> >> >>>> >> >> >>>> >> >> >>>> >> >> >>>> >> >> >>>> >> >> ================================================================================= >>>> >> >> another, now !NEW! feature... >>>> >> >> >>>> >> >> i was looking for a *DISTRIBUTED LOCK MANAGER*, but i only found >>>> >> >> kernel linux lock manager, that's based on file system (flock) >>>> >> >> could we implement a lock manager at memcached? >>>> >> >> >>>> >> >> what lock manager do? >>>> >> >> client send: KEY NAME, lock type+client name (KEY VALUE), key >>>> >> >> timeout, >>>> >> >> wait lock timeout (infinity/seconds) >>>> >> >> (this can be implement in memcached protocol without many >>>> >> >> modifications!!!) >>>> >> >> server side function: >>>> >> >> 1)seek if client can have this lock >>>> >> >> 2)wait lock timeout... (this is a problem since we can have a very >>>> >> >> big >>>> >> >> wait time...) >>>> >> >> 3) if client disconect exit do while >>>> >> >> 4) yes we have the lock => change key value (give this lock to >>>> >> >> client), exit do >>>> >> >> 5) no we don't have the lock, exit do >>>> >> >> 6) end of do while... return key value: lock type + client name >>>> >> >> (like >>>> >> >> a get command) >>>> >> >> >>>> >> >> ideas: >>>> >> >> 1)maybe a separated memory size? we can run two separated servers, >>>> >> >> one >>>> >> >> for keys another for lock function (make command line options: >>>> >> >> just >>>> >> >> lock system, objects only system or both) >>>> >> >> >>>> >> >> 2)this type of key is diferent from memcached key cache objects, >>>> >> >> that's obvious >>>> >> >> >>>> >> >> but........ is managed with same functions... (get, list, etc) >>>> >> >> but........ >>>> >> >> all write/delete functions can't be done, they MUST be done by >>>> >> >> LOCK >>>> >> >> (the new) function, >>>> >> >> DELETE/UNLOCK function is a LOCK function with lock type=0 >>>> >> >> (unlock) >>>> >> >> read can be done by get and will return current client lock name >>>> >> >> and >>>> >> >> lock type (get command) >>>> >> >> >>>> >> >> >>>> >> >> >>>> >> >> *WHY THIS FEATURE?* >>>> >> >> i didn't found a distributed lock manager for user space (not >>>> >> >> kernel >>>> >> >> space) with easy to implement protocol, and many program >>>> >> >> languages, >>>> >> >> and a very mature server and protocol. >>>> >> >> =( >>>> >> >> >>>> >> >> but with this feature... >>>> >> >> I DON'T NEED A SAMBA/NFS SERVER FOR NON FILESYSTEM LOCKING!!!!! >>>> >> >> \o/ >>>> >> >> I WILL NEVER USE FLOCK() AGAIN!!! \o/ !!! >>>> >> >> >>>> >> >> I JUST NEED: >>>> >> >> MYSQL+MEMCACHED+ (APACHE+CGI/PHP/JAVA/PERL/PYTHON) >>>> >> >> for any cluster solution, no more filesystem!!! >>>> >> >> >>>> >> >> NO MORE FILESYSTEM REPLICATIONS (DRBD, NBD+RAID) FOR MY HIGH >>>> >> >> AVAIBILITY / CLUSTER SOLUTION!!!!! >>>> >> >> WE CAN USE REPCACHED (WE NEED A SYNC MODE).... >>>> >> >> >>>> >> >> THINK ABOUT IT!!! >>>> >> >> REPLICATION + FLOCK!!!!! IT'S A VERY VERY VERY NICE FEATURE!!!!! >>>> >> >> >>>> >> >> ==================== >>>> >> >> type of object (1bit) default / lock manager can be putted on key >>>> >> >> options/flags!!! >>>> >> >> inside key value, we can put: >>>> >> >> lock type(3 bits) >>>> >> >> client name (a variable length, many bytes) >>>> >> >> >>>> >> >> http://en.wikipedia.org/wiki/Distributed_lock_manager >>>> >> >> from wikipedia, TYPE OF LOCKS: >>>> >> >> * Null Lock (NL). Indicates interest in the resource, but does not >>>> >> >> prevent other processes from locking it. It has the advantage that >>>> >> >> the >>>> >> >> resource and its lock value block are preserved, even when no >>>> >> >> processes are locking it. >>>> >> >> * Concurrent Read (CR). Indicates a desire to read (but not >>>> >> >> update) the resource. It allows other processes to read or update >>>> >> >> the >>>> >> >> resource, but prevents others from having exclusive access to it. >>>> >> >> This >>>> >> >> is usually employed on high-level resources, in order that more >>>> >> >> restrictive locks can be obtained on subordinate resources. >>>> >> >> * Concurrent Write (CW). Indicates a desire to read and update the >>>> >> >> resource. It also allows other processes to read or update the >>>> >> >> resource, but prevents others from having exclusive access to it. >>>> >> >> This >>>> >> >> is also usually employed on high-level resources, in order that >>>> >> >> more >>>> >> >> restrictive locks can be obtained on subordinate resources. >>>> >> >> * Protected Read (PR). This is the traditional share lock, which >>>> >> >> indicates a desire to read the resource but prevents other from >>>> >> >> updating it. Others can however also read the resource. >>>> >> >> * Protected Write (PW). This is the traditional update lock, which >>>> >> >> indicates a desire to read and update the resource and prevents >>>> >> >> others >>>> >> >> from updating it. Others with Concurrent Read access can however >>>> >> >> read >>>> >> >> the resource. >>>> >> >> * Exclusive (EX). This is the traditional exclusive lock which >>>> >> >> allows read and update access to the resource, and prevents others >>>> >> >> from having any access to it. >>>> >> >> >>>> >> >> NEW LOCK FUNCTION: >>>> >> >> >>>> >> >> LOCK <key><lock_type><client name><timeout><wait lock timeout> >>>> >> >> >>>> >> >> key: key name >>>> >> >> <lock_type+client_name>=key value >>>> >> >> >>>> >> >> lock_type: >>>> >> >> NL = 0 >>>> >> >> CR = 1 >>>> >> >> CW = 2 >>>> >> >> PR = 3 >>>> >> >> PW = 4 >>>> >> >> EX = 5 >>>> >> >> >>>> >> >> client name: any value >>>> >> >> timeout: any number, 0=infinity >>>> >> >> wait lock timeout: wait lock time, 0=infinity >>>> >> >> >>>> >> >> how lock works: (see that lock type is only 0 or !=0 in this >>>> >> >> logic...) >>>> >> >> i will use <sent xxxx> for user new value, and <current xxx> for >>>> >> >> the >>>> >> >> current server value >>>> >> >> >>>> >> >> if key don't exists, create >>>> >> >> do{ >>>> >> >> if ((sent_lock_type = 0 and sent_client_name = >>>> >> >> current_client_name) >>>> >> >> or key_timed_out==1) >>>> >> >> remove key (delete) >>>> >> >> send null lock and sent_client_name information >>>> >> >> exit function >>>> >> >> }else if (sent lock type = (1 or 2 or 3 or 4 or 5), and current >>>> >> >> user >>>> >> >> = sent user) >>>> >> >> set >>>> >> >> >>>> >> >> >>>> >> >> current_client_name,current_lock_type=sent_client_name,sent_lock_type >>>> >> >> exit do >>>> >> >> }else{ >>>> >> >> if wait lock time < time waiting lock to occur >>>> >> >> exit do >>>> >> >> } >>>> >> >> }while(1) >>>> >> >> send current_lock_type and sent_client_name >>>> >> >> exit function >>>> >> >> >>>> >> >> >>>> >> >> thanks guys!!! >>>> >> > >>>> >> >>>> >> >>>> >> >>>> >> -- >>>> >> Roberto Spadim >>>> >> Spadim Technology / SPAEmpresarial >>>> > >>>> > >>>> > >>>> > -- >>>> > awl >>>> > >>>> >>>> >>>> >>>> -- >>>> Roberto Spadim >>>> Spadim Technology / SPAEmpresarial >>> >>> >>> >>> -- >>> awl >>> >> >> >> >> -- >> Roberto Spadim >> Spadim Technology / SPAEmpresarial > -- Roberto Spadim Spadim Technology / SPAEmpresarial