Merge pull request #485 from lbryio/return-pending-claim-lbry-file

file_get by name for file with pending claim
This commit is contained in:
Jack Robison 2017-02-16 11:16:46 -05:00 committed by GitHub
commit f4217d5593
8 changed files with 106 additions and 48 deletions

View file

@ -13,6 +13,7 @@ at anytime.
## [0.8.3] - 2017-02-15 ## [0.8.3] - 2017-02-15
### Fixed ### Fixed
* Get lbry files with pending claims
* Add better logging to help track down [#478](https://github.com/lbryio/lbry/issues/478) * Add better logging to help track down [#478](https://github.com/lbryio/lbry/issues/478)
* Catch UnknownNameErrors when resolving a name. [#479](https://github.com/lbryio/lbry/issues/479) * Catch UnknownNameErrors when resolving a name. [#479](https://github.com/lbryio/lbry/issues/479)

View file

@ -84,6 +84,12 @@ class NoSuchStreamHashError(Exception):
pass pass
class NoSuchSDHash(Exception):
"""
Raised if sd hash is not known
"""
class InvalidBlobHashError(Exception): class InvalidBlobHashError(Exception):
pass pass

View file

@ -105,3 +105,7 @@ def setup_certs_for_windows():
def random_string(length=10, chars=string.ascii_lowercase): def random_string(length=10, chars=string.ascii_lowercase):
return ''.join([random.choice(chars) for _ in range(length)]) return ''.join([random.choice(chars) for _ in range(length)])
def short_hash(hash_str):
return hash_str[:6]

View file

@ -7,6 +7,8 @@ from zope.interface import implements
from twisted.internet import defer from twisted.internet import defer
from lbrynet.core.client.StreamProgressManager import FullStreamProgressManager from lbrynet.core.client.StreamProgressManager import FullStreamProgressManager
from lbrynet.core.Error import NoSuchSDHash, NoSuchStreamHashError
from lbrynet.core.utils import short_hash
from lbrynet.core.StreamDescriptor import StreamMetadata from lbrynet.core.StreamDescriptor import StreamMetadata
from lbrynet.lbryfile.client.EncryptedFileDownloader import EncryptedFileSaver from lbrynet.lbryfile.client.EncryptedFileDownloader import EncryptedFileSaver
from lbrynet.lbryfile.client.EncryptedFileDownloader import EncryptedFileDownloader from lbrynet.lbryfile.client.EncryptedFileDownloader import EncryptedFileDownloader
@ -17,6 +19,18 @@ from lbrynet.lbryfile.StreamDescriptor import save_sd_info
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def log_status(uri, sd_hash, status):
if status == ManagedEncryptedFileDownloader.STATUS_RUNNING:
status_string = "running"
elif status == ManagedEncryptedFileDownloader.STATUS_STOPPED:
status_string = "stopped"
elif status == ManagedEncryptedFileDownloader.STATUS_FINISHED:
status_string = "finished"
else:
status_string = "unknown"
log.info("lbry://%s (%s) is %s", uri, short_hash(sd_hash), status_string)
class ManagedEncryptedFileDownloader(EncryptedFileSaver): class ManagedEncryptedFileDownloader(EncryptedFileSaver):
STATUS_RUNNING = "running" STATUS_RUNNING = "running"
STATUS_STOPPED = "stopped" STATUS_STOPPED = "stopped"
@ -47,17 +61,11 @@ class ManagedEncryptedFileDownloader(EncryptedFileSaver):
@defer.inlineCallbacks @defer.inlineCallbacks
def restore(self): def restore(self):
sd_hash = yield self.stream_info_manager.get_sd_blob_hashes_for_stream(self.stream_hash) yield self.load_file_attributes()
if sd_hash:
self.sd_hash = sd_hash[0]
else:
raise Exception("No sd hash for stream hash %s" % self.stream_hash)
claim_metadata = yield self.wallet.get_claim_metadata_for_sd_hash(self.sd_hash)
if claim_metadata is None:
raise Exception("A claim doesn't exist for sd %s" % self.sd_hash)
self.uri, self.txid, self.nout = claim_metadata
self.claim_id = yield self.wallet.get_claimid(self.uri, self.txid, self.nout)
status = yield self.lbry_file_manager.get_lbry_file_status(self) status = yield self.lbry_file_manager.get_lbry_file_status(self)
log_status(self.uri, self.sd_hash, status)
if status == ManagedEncryptedFileDownloader.STATUS_RUNNING: if status == ManagedEncryptedFileDownloader.STATUS_RUNNING:
# start returns self.finished_deferred # start returns self.finished_deferred
# which fires when we've finished downloading the file # which fires when we've finished downloading the file
@ -73,7 +81,7 @@ class ManagedEncryptedFileDownloader(EncryptedFileSaver):
@defer.inlineCallbacks @defer.inlineCallbacks
def stop(self, err=None, change_status=True): def stop(self, err=None, change_status=True):
log.debug('Stopping download for %s', self.sd_hash) log.debug('Stopping download for %s', short_hash(self.sd_hash))
# EncryptedFileSaver deletes metadata when it's stopped. We don't want that here. # EncryptedFileSaver deletes metadata when it's stopped. We don't want that here.
yield EncryptedFileDownloader.stop(self, err=err) yield EncryptedFileDownloader.stop(self, err=err)
if change_status is True: if change_status is True:
@ -98,20 +106,29 @@ class ManagedEncryptedFileDownloader(EncryptedFileSaver):
num_blobs_known, status)) num_blobs_known, status))
@defer.inlineCallbacks @defer.inlineCallbacks
def _start(self): def load_file_attributes(self):
log.info('Starting Downloader for %s', self.stream_hash)
yield EncryptedFileSaver._start(self)
sd_hash = yield self.stream_info_manager.get_sd_blob_hashes_for_stream(self.stream_hash) sd_hash = yield self.stream_info_manager.get_sd_blob_hashes_for_stream(self.stream_hash)
if len(sd_hash): if sd_hash:
self.sd_hash = sd_hash[0] self.sd_hash = sd_hash[0]
maybe_metadata = yield self.wallet.get_claim_metadata_for_sd_hash(self.sd_hash) else:
if maybe_metadata: raise NoSuchStreamHashError(self.stream_hash)
name, txid, nout = maybe_metadata stream_metadata = yield self.wallet.get_claim_metadata_for_sd_hash(self.sd_hash)
self.uri = name if stream_metadata:
self.txid = txid name, txid, nout = stream_metadata
self.nout = nout self.uri = name
self.txid = txid
self.nout = nout
else:
raise NoSuchSDHash(self.sd_hash)
self.claim_id = yield self.wallet.get_claimid(self.uri, self.txid, self.nout)
defer.returnValue(None)
@defer.inlineCallbacks
def _start(self):
yield EncryptedFileSaver._start(self)
yield self.load_file_attributes()
status = yield self._save_status() status = yield self._save_status()
log.info('Set Downloader status for %s to %s', self.stream_hash, status) log_status(self.uri, self.sd_hash, status)
defer.returnValue(status) defer.returnValue(status)
def _get_finished_deferred_callback_value(self): def _get_finished_deferred_callback_value(self):
@ -133,6 +150,9 @@ class ManagedEncryptedFileDownloader(EncryptedFileSaver):
self._saving_status = False self._saving_status = False
defer.returnValue(status) defer.returnValue(status)
def save_status(self):
return self._save_status()
def _get_progress_manager(self, download_manager): def _get_progress_manager(self, download_manager):
return FullStreamProgressManager(self._finished_downloading, return FullStreamProgressManager(self._finished_downloading,
self.blob_manager, download_manager) self.blob_manager, download_manager)

View file

@ -45,7 +45,7 @@ from lbrynet.core.Wallet import LBRYumWallet, SqliteStorage
from lbrynet.core.looping_call_manager import LoopingCallManager from lbrynet.core.looping_call_manager import LoopingCallManager
from lbrynet.core.server.BlobRequestHandler import BlobRequestHandlerFactory from lbrynet.core.server.BlobRequestHandler import BlobRequestHandlerFactory
from lbrynet.core.server.ServerProtocol import ServerProtocolFactory from lbrynet.core.server.ServerProtocol import ServerProtocolFactory
from lbrynet.core.Error import InsufficientFundsError, UnknownNameError from lbrynet.core.Error import InsufficientFundsError, UnknownNameError, NoSuchSDHash
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -794,7 +794,6 @@ class Daemon(AuthJSONRPCServer):
d = reupload.reflect_stream(publisher.lbry_file) d = reupload.reflect_stream(publisher.lbry_file)
d.addCallbacks(lambda _: log.info("Reflected new publication to lbry://%s", name), d.addCallbacks(lambda _: log.info("Reflected new publication to lbry://%s", name),
log.exception) log.exception)
log.info("Success! Published to lbry://%s txid: %s nout: %d", name, claim_out['txid'], log.info("Success! Published to lbry://%s txid: %s nout: %d", name, claim_out['txid'],
claim_out['nout']) claim_out['nout'])
yield self._add_to_pending_claims(claim_out, name) yield self._add_to_pending_claims(claim_out, name)
@ -957,34 +956,53 @@ class Daemon(AuthJSONRPCServer):
return self.get_est_cost_using_known_size(name, size) return self.get_est_cost_using_known_size(name, size)
return self.get_est_cost_from_name(name) return self.get_est_cost_from_name(name)
def _find_lbry_file_by_uri(self, uri):
for lbry_file in self.lbry_file_manager.lbry_files:
if uri == lbry_file.uri:
return lbry_file
raise UnknownNameError(uri)
def _find_lbry_file_by_sd_hash(self, sd_hash):
for lbry_file in self.lbry_file_manager.lbry_files:
if lbry_file.sd_hash == sd_hash:
return lbry_file
raise NoSuchSDHash(sd_hash)
def _find_lbry_file_by_file_name(self, file_name):
for lbry_file in self.lbry_file_manager.lbry_files:
if lbry_file.file_name == file_name:
return lbry_file
raise Exception("File %s not found" % file_name)
@defer.inlineCallbacks
def _get_lbry_file_by_uri(self, name): def _get_lbry_file_by_uri(self, name):
def _get_file(stream_info): try:
sd = stream_info['sources']['lbry_sd_hash'] stream_info = yield self._resolve_name(name)
sd_hash = stream_info['sources']['lbry_sd_hash']
for l in self.lbry_file_manager.lbry_files: lbry_file = yield self._get_lbry_file_by_sd_hash(sd_hash)
if l.sd_hash == sd: except (UnknownNameError, NoSuchSDHash):
return defer.succeed(l) lbry_file = yield self._find_lbry_file_by_uri(name)
return defer.succeed(None) defer.returnValue(lbry_file)
d = self._resolve_name(name)
d.addCallback(_get_file)
return d
@defer.inlineCallbacks
def _get_lbry_file_by_sd_hash(self, sd_hash): def _get_lbry_file_by_sd_hash(self, sd_hash):
for l in self.lbry_file_manager.lbry_files: lbry_file = yield self._find_lbry_file_by_sd_hash(sd_hash)
if l.sd_hash == sd_hash: defer.returnValue(lbry_file)
return defer.succeed(l)
return defer.succeed(None)
@defer.inlineCallbacks
def _get_lbry_file_by_file_name(self, file_name): def _get_lbry_file_by_file_name(self, file_name):
for l in self.lbry_file_manager.lbry_files: lbry_file = yield self._get_lbry_file_by_file_name(file_name)
if l.file_name == file_name: defer.returnValue(lbry_file)
return defer.succeed(l)
return defer.succeed(None)
@defer.inlineCallbacks
def _get_lbry_file(self, search_by, val, return_json=True): def _get_lbry_file(self, search_by, val, return_json=True):
return _GetFileHelper(self, search_by, val, return_json).retrieve_file() helper = _GetFileHelper(self, search_by, val, return_json)
try:
lbry_file = yield helper.retrieve_file()
defer.returnValue(lbry_file)
except Exception as err:
# TODO: do something with the error, don't return None when a file isn't found
defer.returnValue(None)
def _get_lbry_files(self): def _get_lbry_files(self):
def safe_get(sd_hash): def safe_get(sd_hash):

View file

@ -48,6 +48,9 @@ class Publisher(object):
metadata['content_type'] = get_content_type(file_path) metadata['content_type'] = get_content_type(file_path)
metadata['ver'] = Metadata.current_version metadata['ver'] = Metadata.current_version
claim_out = yield self.make_claim(name, bid, metadata) claim_out = yield self.make_claim(name, bid, metadata)
self.lbry_file.completed = True
yield self.lbry_file.load_file_attributes()
yield self.lbry_file.save_status()
defer.returnValue(claim_out) defer.returnValue(claim_out)
@defer.inlineCallbacks @defer.inlineCallbacks

View file

@ -12,6 +12,7 @@ from lbrynet.lbryfile.EncryptedFileMetadataManager import DBEncryptedFileMetadat
from lbrynet.lbryfilemanager.EncryptedFileManager import EncryptedFileManager from lbrynet.lbryfilemanager.EncryptedFileManager import EncryptedFileManager
from lbrynet.core.Session import Session from lbrynet.core.Session import Session
from lbrynet.core.StreamDescriptor import StreamDescriptorIdentifier from lbrynet.core.StreamDescriptor import StreamDescriptorIdentifier
from lbrynet.lbryfile import publish_sd_blob
from lbrynet.lbryfilemanager.EncryptedFileCreator import create_lbry_file from lbrynet.lbryfilemanager.EncryptedFileCreator import create_lbry_file
from lbrynet.lbryfile.client.EncryptedFileOptions import add_lbry_file_to_sd_identifier from lbrynet.lbryfile.client.EncryptedFileOptions import add_lbry_file_to_sd_identifier
from lbrynet.lbryfile.StreamDescriptor import get_sd_info from lbrynet.lbryfile.StreamDescriptor import get_sd_info
@ -158,11 +159,13 @@ class TestStreamify(TestCase):
d.addCallback(lambda _: check_md5_sum()) d.addCallback(lambda _: check_md5_sum())
return d return d
@defer.inlineCallbacks
def create_stream(): def create_stream():
test_file = GenFile(53209343, b''.join([chr(i + 5) for i in xrange(0, 64, 6)])) test_file = GenFile(53209343, b''.join([chr(i + 5) for i in xrange(0, 64, 6)]))
return create_lbry_file( stream_hash = yield create_lbry_file(self.session, self.lbry_file_manager, "test_file",
self.session, self.lbry_file_manager, "test_file", test_file, test_file, suggested_file_name="test_file")
suggested_file_name="test_file") yield publish_sd_blob(self.stream_info_manager, self.session.blob_manager, stream_hash)
defer.returnValue(stream_hash)
d = self.session.setup() d = self.session.setup()
d.addCallback(lambda _: self.stream_info_manager.setup()) d.addCallback(lambda _: self.stream_info_manager.setup())

View file

@ -80,6 +80,9 @@ class Wallet(object):
def get_claim_metadata_for_sd_hash(self, sd_hash): def get_claim_metadata_for_sd_hash(self, sd_hash):
return "fakeuri", "faketxid", "fakenout" return "fakeuri", "faketxid", "fakenout"
def get_claimid(self, name, txid=None, nout=None):
return "fake claimid"
class PeerFinder(object): class PeerFinder(object):
def __init__(self, start_port, peer_manager, num_peers): def __init__(self, start_port, peer_manager, num_peers):