コード例 #1
0
 @Test
 public void test() {
   Command<KVStore> initial = commands.remove(0);
   sm.applyFunction().apply(0L, initial);
   commands.forEach(
       c -> {
         final long index = la.longValue();
         sm.applyFunction().apply(index, c);
         la.increment();
       });
   KVStore kvsm = (KVStore) sm;
   kvsm.getKvMap().forEach((k, v) -> System.out.println(k + " --> " + v));
   assertTrue(kvsm.getKvMap().size() == 10);
 }
コード例 #2
0
ファイル: KVServer.java プロジェクト: jxwuyi/kvstore-new
 /**
  * Check if the server has a given key. This is used for TPC operations that need to check whether
  * or not a transaction can be performed but you don't want to modify the state of the cache by
  * calling get(). You are allowed to call dataStore.get() for this method.
  *
  * @param key key to check for membership in store
  */
 public boolean hasKey(String key) {
   try {
     dataStore.get(key);
   } catch (KVException e) { // an exception of key_not_found is caught
     return false;
   }
   return true;
 }
コード例 #3
0
ファイル: KVServer.java プロジェクト: jxwuyi/kvstore-new
  /**
   * Performs del request.
   *
   * @param key String key
   * @throws KVException with ERROR_NO_SUCH_KEY if key does not exist in store
   */
  @Override
  public void del(String key) throws KVException {
    if (key.length() > MAX_KEY_SIZE) {
      KVMessage msg = new KVMessage(KVConstants.RESP, ERROR_NO_SUCH_KEY);
      throw new KVException(msg);
    }

    Lock lock = dataCache.getLock(key);
    try {
      lock.lock();
      dataCache.del(key);
      dataStore.del(key);
    } finally {
      lock.unlock();
    }
  }
コード例 #4
0
ファイル: KVServer.java プロジェクト: jxwuyi/kvstore-new
 /**
  * Performs put request on cache and store.
  *
  * @param key String key
  * @param value String value
  * @throws KVException if key or value is too long
  */
 @Override
 public void put(String key, String value) throws KVException {
   if (key.length() > MAX_KEY_SIZE) {
     KVMessage msg = new KVMessage(KVConstants.RESP, ERROR_OVERSIZED_KEY);
     throw new KVException(msg);
   }
   if (value.length() > MAX_VAL_SIZE) {
     KVMessage msg = new KVMessage(KVConstants.RESP, ERROR_OVERSIZED_VALUE);
     throw new KVException(msg);
   }
   Lock lock = dataCache.getLock(key);
   try {
     // In case of some unexpected exception thrown here
     lock.lock();
     dataCache.put(key, value);
     dataStore.put(key, value);
   } finally {
     lock.unlock();
   }
 }
コード例 #5
0
ファイル: KVServer.java プロジェクト: jxwuyi/kvstore-new
  /**
   * Performs get request. Checks cache first. Updates cache if not in cache but located in store.
   *
   * @param key String key
   * @return String value associated with key
   * @throws KVException with ERROR_NO_SUCH_KEY if key does not exist in store
   */
  @Override
  public String get(String key) throws KVException {
    if (key.length() > MAX_KEY_SIZE) {
      KVMessage msg = new KVMessage(KVConstants.RESP, ERROR_NO_SUCH_KEY);
      throw new KVException(msg);
    }

    Lock lock = dataCache.getLock(key);
    String ret = null;
    try {
      lock.lock();
      ret = dataCache.get(key);
      if (ret == null) {
        ret = dataStore.get(key);
        if (ret != null) dataCache.put(key, ret);
      }
    } finally {
      lock.unlock();
    }
    return ret;
  }
コード例 #6
0
ファイル: KVServer.java プロジェクト: jxwuyi/kvstore-new
 /** This method is purely for convenience and will not be tested. */
 @Override
 public String toString() {
   return dataStore.toString() + dataCache.toString();
 }