adb: fix `push --sync` with multiple inputs.
Previously, when push --sync was used with multiple files, we tried to stat a remote file with pending acknowledgements still in the socket buffer, which leads to an abort when we read ID_OKAY instead of the response we were expecting. This patch changes the behavior to always wait for acknowledgements if we're pushing with --sync (or `adb sync`). This results in a ~100ms regression during a 10 second sync of every file on the system image, but that's not very much, so perhaps we should consider doing this always. Bug: http://b/166155032 Test: test_device.py Change-Id: I7110243071ba5fbaa77dcc76f42a19d9ed2b4195
This commit is contained in:
parent
ef2c28bf71
commit
1b65ebe2e0
|
@ -1053,7 +1053,7 @@ static bool sync_send(SyncConnection& sc, const std::string& lpath, const std::s
|
|||
if (!sc.SendSmallFile(rpath, mode, lpath, rpath, mtime, buf, data_length, dry_run)) {
|
||||
return false;
|
||||
}
|
||||
return sc.ReadAcknowledgements();
|
||||
return sc.ReadAcknowledgements(sync);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1077,7 +1077,7 @@ static bool sync_send(SyncConnection& sc, const std::string& lpath, const std::s
|
|||
return false;
|
||||
}
|
||||
}
|
||||
return sc.ReadAcknowledgements();
|
||||
return sc.ReadAcknowledgements(sync);
|
||||
}
|
||||
|
||||
static bool sync_recv_v1(SyncConnection& sc, const char* rpath, const char* lpath, const char* name,
|
||||
|
|
|
@ -1271,6 +1271,31 @@ class FileOperationsTest:
|
|||
if temp_dir is not None:
|
||||
shutil.rmtree(temp_dir)
|
||||
|
||||
def test_push_sync_multiple(self):
|
||||
"""Sync multiple host directories to a specific path."""
|
||||
|
||||
try:
|
||||
temp_dir = tempfile.mkdtemp()
|
||||
temp_files = make_random_host_files(in_dir=temp_dir, num_files=32)
|
||||
|
||||
device_dir = posixpath.join(self.DEVICE_TEMP_DIR, 'sync_src_dst')
|
||||
|
||||
# Clean up any stale files on the device.
|
||||
device = adb.get_device() # pylint: disable=no-member
|
||||
device.shell(['rm', '-rf', device_dir])
|
||||
device.shell(['mkdir', '-p', device_dir])
|
||||
|
||||
host_paths = [os.path.join(temp_dir, x.base_name) for x in temp_files]
|
||||
device.push(host_paths, device_dir, sync=True)
|
||||
|
||||
self.verify_sync(device, temp_files, device_dir)
|
||||
|
||||
self.device.shell(['rm', '-rf', self.DEVICE_TEMP_DIR])
|
||||
finally:
|
||||
if temp_dir is not None:
|
||||
shutil.rmtree(temp_dir)
|
||||
|
||||
|
||||
def test_push_dry_run_nonexistent_file(self):
|
||||
"""Push with dry run."""
|
||||
|
||||
|
|
Loading…
Reference in New Issue