docs: @Override
     public CompletableFuture<Object> invokeAsync() throws Throwable {
        // make sure the get command doesn't perform a remote call
        // as our caller is already calling the ClusteredGetCommand on all the relevant nodes
        // CACHE_MODE_LOCAL is not used as it can be used when we want to ignore the ownership with respect to reads
        long flagBitSet = EnumUtil.bitSetOf(Flag.SKIP_REMOTE_LOOKUP);
        GetCacheEntryCommand command = commandsFactory.buildGetCacheEntryCommand(key, segment,
              EnumUtil.mergeBitSets(flagBitSet, getFlagsBitSet()));
        command.setTopologyId(topologyId);
        InvocationContext invocationContext = icf.createRemoteInvocationContextForCommand(command, getOrigin());
        CompletableFuture<Object> future = invoker.invokeAsync(invocationContext, command);
        return future.thenApply(rv -> {
           if (trace) log.tracef("Return value for key=%s is %s", key, rv);
           //this might happen if the value was fetched from a cache loader
           if (rv instanceof MVCCEntry) {
              MVCCEntry mvccEntry = (MVCCEntry) rv;
              return entryFactory.createValue(mvccEntry);
           } else if (rv instanceof InternalCacheEntry) {
              InternalCacheEntry internalCacheEntry = (InternalCacheEntry) rv;
              return internalCacheEntry.toInternalCacheValue();
           } else { // null or Response
              return rv;
           }
        });
     }