docs: public Version putWithCustomTimeout(CompositeVoldemortRequest<K, V> requestWrapper) {
          validateTimeout(requestWrapper.getRoutingTimeoutInMs());
          List<Versioned<V>> versionedValues;
          long startTime = System.currentTimeMillis();
          String keyHexString = "";
          if(logger.isDebugEnabled()) {
              ByteArray key = (ByteArray) requestWrapper.getKey();
              keyHexString = RestUtils.getKeyHexString(key);
              logger.debug("PUT requested for key: " + keyHexString + " , for store: "
                           + this.storeName + " at time(in ms): " + startTime
                           + " . Nested GET and PUT VERSION requests to follow ---");
          }
  
          // We use the full timeout for doing the Get. In this, we're being
          // optimistic that the subsequent put might be faster such that all the
          // steps might finish within the allotted time
          requestWrapper.setResolveConflicts(true);
          versionedValues = getWithCustomTimeout(requestWrapper);
          Versioned<V> versioned = getItemOrThrow(requestWrapper.getKey(), null, versionedValues);
  
          long endTime = System.currentTimeMillis();
          if(versioned == null)
              versioned = Versioned.value(requestWrapper.getRawValue(), new VectorClock());
          else
              versioned.setObject(requestWrapper.getRawValue());
  
          // This should not happen unless there's a bug in the
          // getWithCustomTimeout
          long timeLeft = requestWrapper.getRoutingTimeoutInMs() - (endTime - startTime);
          if(timeLeft <= 0) {
              throw new StoreTimeoutException("PUT request timed out");
          }
          CompositeVersionedPutVoldemortRequest<K, V> putVersionedRequestObject = new CompositeVersionedPutVoldemortRequest<K, V>(requestWrapper.getKey(),
                                                                                                                                  versioned,
                                                                                                                                  timeLeft);
          putVersionedRequestObject.setRequestOriginTimeInMs(requestWrapper.getRequestOriginTimeInMs());
          Version result = putVersionedWithCustomTimeout(putVersionedRequestObject);
          long endTimeInMs = System.currentTimeMillis();
          if(logger.isDebugEnabled()) {
              logger.debug("PUT response received for key: " + keyHexString + " , for store: "
                           + this.storeName + " at time(in ms): " + endTimeInMs);
          }
          return result;
      }