def remove(self, prefix, key, value, cb):
        _log.debug("Remove key %s, value %s" % (prefix + key, value))
        # Keep local storage for sets updated until confirmed
        if (prefix + key) in self.localstore_sets:
            # Don't append value items any more
            self.localstore_sets[prefix + key]['+'] -= set(value)
            # Remove value items
            self.localstore_sets[prefix + key]['-'] |= set(value)
        else:
            self.localstore_sets[prefix + key] = {'+': set([]), '-': set(value)}

        if self.started:
            coded_value = self.coder.encode(list(self.localstore_sets[prefix + key]['-']))
            self.storage.remove(key=prefix + key, value=coded_value,
                                cb=CalvinCB(func=self.remove_cb, org_key=key, org_value=value, org_cb=cb))
        else:
            if cb:
                cb(key=key, value=True)
Test that a timeout is set up when the last output is used and that if
dataset/ETHPy150Open EricssonResearch/calvin-base/calvin/runtime/north/storage.py/Storage.remove--crossover with--dataset/ETHPy150Open twisted/nevow/nevow/test/test_athena.py/Transport.testOutputConsumedMessageTimeout